aboutsummaryrefslogtreecommitdiff
path: root/Foundation/GTMNSDictionary+URLArgumentsTest.m
blob: f07e970f0f5c7f21eddc370b09cb1b47f9de93ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//
//  GTMNSDictionary+URLArgumentsTest.m
//
//  Copyright 2006-2008 Google Inc.
//
//  Licensed under the Apache License, Version 2.0 (the "License"); you may not
//  use this file except in compliance with the License.  You may obtain a copy
//  of the License at
//
//  http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
//  License for the specific language governing permissions and limitations under
//  the License.
//

#import "GTMSenTestCase.h"
#import "GTMNSDictionary+URLArguments.h"
#import "GTMDefines.h"

#pragma clang diagnostic push
// Ignore all of the deprecation warnings for GTMNSDictionary+URLArguments
#pragma clang diagnostic ignored "-Wdeprecated-declarations"

@interface GTMNSDictionary_URLArgumentsTest : GTMTestCase
@end

@implementation GTMNSDictionary_URLArgumentsTest

- (void)testFromArgumentsString {
  XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@""],
                        [NSDictionary dictionary],
                        @"- empty arguments string should give an empty dictionary");
  XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a"],
                        [NSDictionary dictionaryWithObject:@"" forKey:@"a"],
                        @"- missing '=' should result in an empty string value");
  XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a="],
                        [NSDictionary dictionaryWithObject:@"" forKey:@"a"],
                        @"- no value");
  XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"&a=1"],
                        [NSDictionary dictionaryWithObject:@"1" forKey:@"a"],
                        @"- empty segment should be skipped");
  XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"abc=123"],
                        [NSDictionary dictionaryWithObject:@"123" forKey:@"abc"],
                        @"- simple one-pair dictionary should work");
  XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a=1&a=2&a=3"],
                        [NSDictionary dictionaryWithObject:@"1" forKey:@"a"],
                        @"- only first occurrence of a key is returned");
  NSString* complex = @"a%2Bb=specialkey&complex=1%2B1%21%3D3%20%26%202%2A6%2F3%3D4&c";
  NSDictionary* result = [NSDictionary dictionaryWithObjectsAndKeys:
                          @"1+1!=3 & 2*6/3=4", @"complex",
                                @"specialkey", @"a+b",
                                          @"", @"c",
                                               nil];
  XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:complex],
                        result,
                        @"- keys and values should be unescaped correctly");
  XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a=%FC"],
                        [NSDictionary dictionaryWithObject:@"" forKey:@"a"],
                        @"- invalid UTF8 characters result in an empty value, not a crash");
}

- (void)testArgumentsString {
  XCTAssertEqualObjects([[NSDictionary dictionary] gtm_httpArgumentsString], @"",
                        @"- empty dictionary should give an empty string");
  XCTAssertEqualObjects([[NSDictionary dictionaryWithObject:@"123" forKey:@"abc"] gtm_httpArgumentsString],
                        @"abc=123",
                        @"- simple one-pair dictionary should work");
  NSDictionary* arguments = [NSDictionary dictionaryWithObjectsAndKeys:
                             @"1+1!=3 & 2*6/3=4", @"complex",
                                   @"specialkey", @"a+b",
                                                  nil];
  NSString* argumentString = [arguments gtm_httpArgumentsString];
  // check for individual pieces since order is not guaranteed
  NSString* component1 = @"a%2Bb=specialkey";
  NSString* component2 = @"complex=1%2B1%21%3D3%20%26%202%2A6%2F3%3D4";
  XCTAssertNotEqual([argumentString rangeOfString:component1].location, (NSUInteger)NSNotFound,
                    @"- '%@' not found in '%@'", component1, argumentString);
  XCTAssertNotEqual([argumentString rangeOfString:component2].location, (NSUInteger)NSNotFound,
                    @"- '%@' not found in '%@'", component2, argumentString);
  XCTAssertNotEqual([argumentString rangeOfString:@"&"].location, (NSUInteger)NSNotFound,
                    @"- special characters should be escaped");
  XCTAssertNotEqual([argumentString characterAtIndex:0], (unichar)'&',
                    @"- there should be no & at the beginning of the string");
  XCTAssertNotEqual([argumentString characterAtIndex:([argumentString length] - 1)], (unichar)'&',
                    @"- there should be no & at the end of the string");
}

@end

#pragma clang diagnostic pop