TwitterNetworkLayerTests/TNLRequestTests.m (218 lines of code) (raw):
//
// TNLRequestTests.m
// TwitterNetworkLayer
//
// Created on 10/28/14.
// Copyright © 2020 Twitter. All rights reserved.
//
#import "TNLError.h"
#import "TNLHTTPRequest.h"
#import "TNLRequestConfiguration.h"
@import XCTest;
@interface TNLRequestTests : XCTestCase
@end
@implementation TNLRequestTests
- (void)testConcreteRequestConstructors
{
TNLHTTPRequest *request;
NSURL *url = [NSURL URLWithString:@"http://www.dummy.com/path?something=else"];
TNLHTTPMethod method = TNLHTTPMethodPOST;
NSDictionary *fields = @{ @"Header1" : @"Value1", @"Header2" : @"Value2" };
NSData *body = [@"Body String" dataUsingEncoding:NSUTF8StringEncoding];
NSMutableURLRequest *mURLRequest = [NSMutableURLRequest requestWithURL:url];
mURLRequest.HTTPMethod = @"POST";
mURLRequest.HTTPBody = body;
mURLRequest.allHTTPHeaderFields = fields;
request = [[TNLHTTPRequest alloc] initWithURL:url HTTPMethodValue:method HTTPHeaderFields:fields HTTPBody:body HTTPBodyStream:nil HTTPBodyFilePath:nil];
XCTAssertEqualObjects(request.URL, url);
XCTAssertEqual(request.HTTPMethodValue, method);
XCTAssertEqualObjects(request.allHTTPHeaderFields, fields);
XCTAssertEqualObjects(request.HTTPBody, body);
XCTAssertEqualObjects(@"Value1", [request valueForHTTPHeaderField:@"Header1"]);
request = [[TNLHTTPRequest alloc] initWithURLRequest:mURLRequest];
XCTAssertEqualObjects(request.URL, url);
XCTAssertEqual(request.HTTPMethodValue, method);
XCTAssertEqualObjects(request.allHTTPHeaderFields, fields);
XCTAssertEqualObjects(request.HTTPBody, body);
XCTAssertEqualObjects(@"Value1", [request valueForHTTPHeaderField:@"Header1"]);
}
- (void)testConcreteRequestMutability
{
TNLHTTPRequest *request;
TNLMutableHTTPRequest *mRequest;
NSURL *url = [NSURL URLWithString:@"http://www.dummy.com/path?something=else"];
TNLHTTPMethod method = TNLHTTPMethodPOST;
NSDictionary *fields = @{ @"Header1" : @"Value1", @"Header2" : @"Value2" };
NSData *body = [@"Body String" dataUsingEncoding:NSUTF8StringEncoding];
mRequest = [[TNLMutableHTTPRequest alloc] initWithURL:nil];
mRequest.URL = url;
mRequest.HTTPMethodValue = TNLHTTPMethodPOST;
mRequest.allHTTPHeaderFields = fields;
mRequest.HTTPBody = body;
request = [[TNLHTTPRequest alloc] initWithURL:url HTTPMethodValue:method HTTPHeaderFields:fields HTTPBody:body HTTPBodyStream:nil HTTPBodyFilePath:nil];
XCTAssertEqualObjects(mRequest, request);
XCTAssertEqualObjects([mRequest copy], mRequest);
XCTAssertEqualObjects([mRequest mutableCopy], mRequest);
XCTAssertEqualObjects([request copy], request);
XCTAssertEqualObjects([request mutableCopy], request);
XCTAssertTrue([mRequest isKindOfClass:[TNLMutableHTTPRequest class]]);
XCTAssertTrue([[mRequest mutableCopy] isKindOfClass:[TNLMutableHTTPRequest class]]);
XCTAssertTrue([[request mutableCopy] isKindOfClass:[TNLMutableHTTPRequest class]]);
XCTAssertFalse([request isKindOfClass:[TNLMutableHTTPRequest class]]);
XCTAssertFalse([[request copy] isKindOfClass:[TNLMutableHTTPRequest class]]);
XCTAssertFalse([[mRequest copy] isKindOfClass:[TNLMutableHTTPRequest class]]);
XCTAssertEqualObjects(@"Value1", [mRequest valueForHTTPHeaderField:@"header1"]);
[mRequest setValue:@"ValueX" forHTTPHeaderField:@"HEADER1"];
XCTAssertEqualObjects(@"ValueX", [mRequest valueForHTTPHeaderField:@"header1"]);
XCTAssertNotEqualObjects(mRequest, request);
}
- (void)testRequestValidate
{
TNLMutableHTTPRequest *mRequest;
NSMutableURLRequest *mURLRequest;
NSError *error;
NSData *data = [@"Body" dataUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:@"http://www.dummy.com/path?something=else"];
TNLMutableRequestConfiguration *config = [TNLMutableRequestConfiguration defaultConfiguration];
mURLRequest = [NSMutableURLRequest requestWithURL:url];
mURLRequest.HTTPBody = data;
mURLRequest.HTTPMethod = @"POST";
mURLRequest.allHTTPHeaderFields = @{ @"Header1" : @"Value1", @"Header2" : @"Value2" };
mRequest = [[TNLMutableHTTPRequest alloc] initWithURLRequest:mURLRequest];
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, mRequest, NO /*quickBodyCheck*/));
XCTAssertTrue(TNLRequestValidate(mURLRequest, config, &error));
XCTAssertNil(error);
if (error) {
NSLog(@"%@", error);
}
XCTAssertTrue(TNLRequestValidate(mRequest, config, &error));
XCTAssertNil(error);
if (error) {
NSLog(@"%@", error);
}
// IDYN-357, POSTs and PUTs support the body being optional
mURLRequest.HTTPBody = nil;
mRequest.HTTPBody = nil;
XCTAssertTrue(TNLRequestValidate(mURLRequest, config, &error));
XCTAssertNil(error);
error = nil;
XCTAssertTrue(TNLRequestValidate(mRequest, config, &error));
XCTAssertNil(error);
error = nil;
mURLRequest.HTTPBody = data;
mRequest.HTTPBody = data;
XCTAssertTrue(TNLRequestValidate(mURLRequest, config, NULL /*errorOut*/));
XCTAssertTrue(TNLRequestValidate(mRequest, config, NULL /*errorOut*/));
mURLRequest.URL = nil;
mRequest.URL = nil;
XCTAssertFalse(TNLRequestValidate(mURLRequest, config, &error));
XCTAssertEqualObjects(error.domain, TNLErrorDomain);
error = nil;
XCTAssertFalse(TNLRequestValidate(mRequest, config, &error));
XCTAssertEqualObjects(error.domain, TNLErrorDomain);
error = nil;
mURLRequest.URL = url;
mRequest.URL = url;
XCTAssertTrue(TNLRequestValidate(mURLRequest, config, NULL /*errorOut*/));
XCTAssertTrue(TNLRequestValidate(mRequest, config, NULL /*errorOut*/));
mURLRequest.HTTPMethod = @"GET";
mRequest.HTTPMethodValue = TNLHTTPMethodGET;
XCTAssertTrue(TNLRequestValidate(mURLRequest, config, NULL /*errorOut*/));
XCTAssertTrue(TNLRequestValidate(mRequest, config, NULL /*errorOut*/));
}
- (void)testRequestConversion
{
TNLMutableHTTPRequest *mRequest;
NSMutableURLRequest *mURLRequest;
NSError *error;
NSData *data = [@"Body" dataUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:@"http://www.dummy.com/path?something=else"];
mURLRequest = [NSMutableURLRequest requestWithURL:url];
mURLRequest.HTTPBody = data;
mURLRequest.HTTPMethod = @"POST";
mURLRequest.allHTTPHeaderFields = @{ @"Header1" : @"Value1", @"Header2" : @"Value2" };
mRequest = [[TNLMutableHTTPRequest alloc] initWithURLRequest:mURLRequest];
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, mRequest, NO /*quickBodyCheck*/));
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, TNLRequestToNSURLRequest(mRequest, nil, &error), NO /*quickBodyCheck*/));
mRequest.HTTPBody = [@"Body2" dataUsingEncoding:NSUTF8StringEncoding];
XCTAssertFalse(TNLRequestEqualToRequest(mURLRequest, TNLRequestToNSURLRequest(mRequest, nil, &error), NO /*quickBodyCheck*/));
mURLRequest.HTTPBody = mRequest.HTTPBody;
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, TNLRequestToNSURLRequest(mRequest, nil, &error), NO /*quickBodyCheck*/));
mRequest.HTTPBody = nil;
XCTAssertFalse(TNLRequestEqualToRequest(mURLRequest, TNLRequestToNSURLRequest(mRequest, nil, &error), NO /*quickBodyCheck*/));
mURLRequest.HTTPBody = nil;
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, TNLRequestToNSURLRequest(mRequest, nil, &error), NO /*quickBodyCheck*/));
mRequest.HTTPBody = data;
mURLRequest.HTTPBody = data;
mRequest.HTTPMethodValue = TNLHTTPMethodGET;
XCTAssertFalse(TNLRequestEqualToRequest(mURLRequest, TNLRequestToNSURLRequest(mRequest, nil, &error), NO /*quickBodyCheck*/));
mURLRequest.HTTPMethod = @"GET";
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, TNLRequestToNSURLRequest(mRequest, nil, &error), NO /*quickBodyCheck*/));
mRequest.HTTPBody = nil;
XCTAssertFalse(TNLRequestEqualToRequest(mURLRequest, TNLRequestToNSURLRequest(mRequest, nil, &error), NO /*quickBodyCheck*/));
mURLRequest.HTTPBody = nil;
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, TNLRequestToNSURLRequest(mRequest, nil, &error), NO /*quickBodyCheck*/));
mRequest.URL = [NSURL URLWithString:@"http://www.dummy.com/path"];
XCTAssertFalse(TNLRequestEqualToRequest(mURLRequest, TNLRequestToNSURLRequest(mRequest, nil, &error), NO /*quickBodyCheck*/));
mURLRequest.URL = mRequest.URL;
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, TNLRequestToNSURLRequest(mRequest, nil, &error), NO /*quickBodyCheck*/));
}
- (void)testMethodConversion
{
NSMutableURLRequest *mURLRequest = [[NSMutableURLRequest alloc] init];
TNLMutableHTTPRequest *mRequest = [[TNLMutableHTTPRequest alloc] initWithURLRequest:mURLRequest];
NSArray *enums = @[ @(TNLHTTPMethodOPTIONS),
@(TNLHTTPMethodGET),
@(TNLHTTPMethodHEAD),
@(TNLHTTPMethodPOST),
@(TNLHTTPMethodPUT),
@(TNLHTTPMethodDELETE),
@(TNLHTTPMethodTRACE),
@(TNLHTTPMethodCONNECT) ];
NSArray *strings = @[ @"OPTIONS",
@"GET",
@"HEAD",
@"POST",
@"PUT",
@"DELETE",
@"TRACE",
@"CONNECT" ];
XCTAssertEqual(enums.count, strings.count);
for (NSUInteger i = 0; i < enums.count; i++) {
mURLRequest.HTTPMethod = [strings[i] mutableCopy]; // the mutation will ensure the string is different than the global @"TERM" reference
mRequest.HTTPMethodValue = [enums[i] integerValue];
XCTAssertEqualObjects(strings[i], TNLRequestGetHTTPMethod(mURLRequest));
XCTAssertEqualObjects(strings[i], TNLRequestGetHTTPMethod(mRequest));
XCTAssertEqual([enums[i] integerValue], TNLRequestGetHTTPMethodValue(mURLRequest));
XCTAssertEqual([enums[i] integerValue], TNLRequestGetHTTPMethodValue(mRequest));
}
}
- (void)testRequestEquivalence
{
TNLMutableHTTPRequest *mRequest;
NSMutableURLRequest *mURLRequest;
NSData *data = [@"Body" dataUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:@"http://www.dummy.com/path?something=else"];
mURLRequest = [NSMutableURLRequest requestWithURL:url];
mURLRequest.HTTPBody = data;
mURLRequest.HTTPMethod = @"POST";
mURLRequest.allHTTPHeaderFields = @{ @"Header1" : @"Value1", @"Header2" : @"Value2" };
mRequest = [[TNLMutableHTTPRequest alloc] initWithURLRequest:mURLRequest];
mRequest.allHTTPHeaderFields = @{ @"header1" : @"Value1", @"HEADER2" : @"Value2" };
XCTAssertNotEqualObjects(mURLRequest, mRequest);
XCTAssertEqualObjects(mURLRequest, [mURLRequest copy]);
XCTAssertEqualObjects(mRequest, [mRequest copy]);
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, mRequest, NO /*quickBodyCheck*/));
XCTAssertTrue(TNLRequestEqualToRequest([mURLRequest copy], mRequest, NO /*quickBodyCheck*/));
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, [mRequest copy], NO /*quickBodyCheck*/));
XCTAssertTrue(TNLRequestEqualToRequest([mURLRequest copy], [mRequest copy], NO /*quickBodyCheck*/));
mURLRequest.HTTPBody = [@"Body2" dataUsingEncoding:NSUTF8StringEncoding];
XCTAssertFalse(TNLRequestEqualToRequest(mURLRequest, mRequest, NO /*quickBodyCheck*/));
mRequest.HTTPBody = mURLRequest.HTTPBody;
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, mRequest, NO /*quickBodyCheck*/));
mURLRequest.HTTPMethod = @"GET";
XCTAssertFalse(TNLRequestEqualToRequest(mURLRequest, mRequest, NO /*quickBodyCheck*/));
mRequest.HTTPMethodValue = TNLHTTPMethodGET;
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, mRequest, NO /*quickBodyCheck*/));
mRequest.HTTPBody = nil;
XCTAssertFalse(TNLRequestEqualToRequest(mURLRequest, mRequest, NO /*quickBodyCheck*/));
mURLRequest.HTTPBody = nil;
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, mRequest, NO /*quickBodyCheck*/));
mRequest.URL = [NSURL URLWithString:@"http://www.dummy.com/path"];
XCTAssertFalse(TNLRequestEqualToRequest(mURLRequest, mRequest, NO /*quickBodyCheck*/));
mURLRequest.URL = mRequest.URL;
XCTAssertTrue(TNLRequestEqualToRequest(mURLRequest, mRequest, NO /*quickBodyCheck*/));
}
@end