HTTPHeadersTests.swift 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. //
  2. // HTTPHeadersTests.swift
  3. //
  4. // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
  5. //
  6. // Permission is hereby granted, free of charge, to any person obtaining a copy
  7. // of this software and associated documentation files (the "Software"), to deal
  8. // in the Software without restriction, including without limitation the rights
  9. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. // copies of the Software, and to permit persons to whom the Software is
  11. // furnished to do so, subject to the following conditions:
  12. //
  13. // The above copyright notice and this permission notice shall be included in
  14. // all copies or substantial portions of the Software.
  15. //
  16. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. // THE SOFTWARE.
  23. //
  24. import Alamofire
  25. import XCTest
  26. class HTTPHeadersTests: BaseTestCase {
  27. func testHeadersAreStoreUniquelyByCaseInsensitiveName() {
  28. // Given
  29. let headersFromDictionaryLiteral: HTTPHeaders = ["key": "", "Key": "", "KEY": ""]
  30. let headersFromDictionary = HTTPHeaders(["key": "", "Key": "", "KEY": ""])
  31. let headersFromArrayLiteral: HTTPHeaders = [HTTPHeader(name: "key", value: ""),
  32. HTTPHeader(name: "Key", value: ""),
  33. HTTPHeader(name: "KEY", value: "")]
  34. let headersFromArray = HTTPHeaders([HTTPHeader(name: "key", value: ""),
  35. HTTPHeader(name: "Key", value: ""),
  36. HTTPHeader(name: "KEY", value: "")])
  37. var headersCreatedManually = HTTPHeaders()
  38. headersCreatedManually.update(HTTPHeader(name: "key", value: ""))
  39. headersCreatedManually.update(name: "Key", value: "")
  40. headersCreatedManually.update(name: "KEY", value: "")
  41. // When, Then
  42. XCTAssertEqual(headersFromDictionaryLiteral.count, 1)
  43. XCTAssertEqual(headersFromDictionary.count, 1)
  44. XCTAssertEqual(headersFromArrayLiteral.count, 1)
  45. XCTAssertEqual(headersFromArray.count, 1)
  46. XCTAssertEqual(headersCreatedManually.count, 1)
  47. }
  48. func testHeadersPreserveOrderOfInsertion() {
  49. // Given
  50. let headersFromDictionaryLiteral: HTTPHeaders = ["c": "", "a": "", "b": ""]
  51. // Dictionary initializer can't preserve order.
  52. let headersFromArrayLiteral: HTTPHeaders = [HTTPHeader(name: "b", value: ""),
  53. HTTPHeader(name: "a", value: ""),
  54. HTTPHeader(name: "c", value: "")]
  55. let headersFromArray = HTTPHeaders([HTTPHeader(name: "b", value: ""),
  56. HTTPHeader(name: "a", value: ""),
  57. HTTPHeader(name: "c", value: "")])
  58. var headersCreatedManually = HTTPHeaders()
  59. headersCreatedManually.update(HTTPHeader(name: "c", value: ""))
  60. headersCreatedManually.update(name: "b", value: "")
  61. headersCreatedManually.update(name: "a", value: "")
  62. // When
  63. let dictionaryLiteralNames = headersFromDictionaryLiteral.map { $0.name }
  64. let arrayLiteralNames = headersFromArrayLiteral.map { $0.name }
  65. let arrayNames = headersFromArray.map { $0.name }
  66. let manualNames = headersCreatedManually.map { $0.name }
  67. // Then
  68. XCTAssertEqual(dictionaryLiteralNames, ["c", "a", "b"])
  69. XCTAssertEqual(arrayLiteralNames, ["b", "a", "c"])
  70. XCTAssertEqual(arrayNames, ["b", "a", "c"])
  71. XCTAssertEqual(manualNames, ["c", "b", "a"])
  72. }
  73. func testHeadersCanBeProperlySortedByName() {
  74. // Given
  75. let headers: HTTPHeaders = ["c": "", "a": "", "b": ""]
  76. // When
  77. let sortedHeaders = headers.sorted()
  78. // Then
  79. XCTAssertEqual(headers.map { $0.name }, ["c", "a", "b"])
  80. XCTAssertEqual(sortedHeaders.map { $0.name }, ["a", "b", "c"])
  81. }
  82. func testHeadersCanInsensitivelyGetAndSetThroughSubscript() {
  83. // Given
  84. var headers: HTTPHeaders = ["c": "", "a": "", "b": ""]
  85. // When
  86. headers["C"] = "c"
  87. headers["a"] = "a"
  88. headers["b"] = "b"
  89. // Then
  90. XCTAssertEqual(headers["c"], "c")
  91. XCTAssertEqual(headers.map { $0.value }, ["c", "a", "b"])
  92. XCTAssertEqual(headers.count, 3)
  93. }
  94. func testHeadersPreserveLastFormAndValueOfAName() {
  95. // Given
  96. var headers: HTTPHeaders = ["c": "a"]
  97. // When
  98. headers["C"] = "c"
  99. // Then
  100. XCTAssertEqual(headers.description, "C: c")
  101. }
  102. func testHeadersHaveUnsortedDescription() {
  103. // Given
  104. let headers: HTTPHeaders = ["c": "c", "a": "a", "b": "b"]
  105. // When
  106. let description = headers.description
  107. let expectedDescription = """
  108. c: c
  109. a: a
  110. b: b
  111. """
  112. // Then
  113. XCTAssertEqual(description, expectedDescription)
  114. }
  115. }