Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Full cookie serialization #473

Merged
merged 12 commits into from
Jul 27, 2016
30 changes: 30 additions & 0 deletions Sources/Vapor/Cookie/Cookie.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,36 @@ public struct Cookie {
self.secure = secure
self.HTTPOnly = HTTPOnly
}

public func serialize() -> String {
var serialized = "\(name)=\(value)"

if let expires = expires {
serialized += "; Expires=\(expires)"
}

if let maxAge = maxAge {
serialized += "; Max-Age=\(maxAge)"
}

if let domain = domain {
serialized += "; Domain=\(domain)"
}

if let path = path {
serialized += "; Path=\(path)"
}

if secure {
serialized += "; Secure"
}

if HTTPOnly {
serialized += "; HttpOnly"
}

return serialized
}
}

extension Cookie: Hashable, Equatable {
Expand Down
8 changes: 2 additions & 6 deletions Sources/Vapor/Cookie/Cookies.swift
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,7 @@ extension Cookies {

extension Cookies {
func serialize() -> String? {
guard !self.cookies.isEmpty else { return nil }
return self
.map { cookie in
return "\(cookie.name)=\(cookie.value)"
}
.joined(separator: ";")
guard !cookies.isEmpty else { return nil }
return map { $0.serialize() } .joined(separator: "\r\nSet-Cookie: ")
}
}
1 change: 1 addition & 0 deletions Tests/LinuxMain.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ XCTMain([
testCase(ConsoleTests.allTests),
testCase(ContentTests.allTests),
testCase(ControllerTests.allTests),
testCase(CookieTests.allTests),
testCase(DataSplitTests.allTests),
testCase(EnvironmentTests.allTests),
testCase(EventTests.allTests),
Expand Down
101 changes: 101 additions & 0 deletions Tests/Vapor/CookieTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import XCTest
@testable import Vapor

class CookieTests: XCTestCase {
static let allTests = [
("testInit_setsNameCorrectly", testInit_setsNameCorrectly),
("testInit_setsValueCorrectly", testInit_setsValueCorrectly),
("testInit_setsExpiresCorrectly", testInit_setsExpiresCorrectly),
("testInit_setsMaxAgeCorrectly", testInit_setsMaxAgeCorrectly),
("testInit_setsDomainCorrectly", testInit_setsDomainCorrectly),
("testInit_setsPathCorrectly", testInit_setsPathCorrectly),
("testInit_defaultsToInsecure", testInit_defaultsToInsecure),
("testInit_setsSecureCorrectly", testInit_setsSecureCorrectly),
("testInit_defaultsToNonHTTPOnly", testInit_defaultsToNonHTTPOnly),
("testInit_setsHTTPOnlyCorrectly", testInit_setsHTTPOnlyCorrectly),
("testHashValue_usesNamesHash", testHashValue_usesNamesHash),
("testEquality_reliesSolelyOnName", testEquality_reliesSolelyOnName),
("testSerialize_producesExpectedOutput", testSerialize_producesExpectedOutput)
]

func testInit_setsNameCorrectly() {
let subject = Cookie(name: "Foo", value: "Bar")
XCTAssertEqual(subject.name, "Foo")
}

func testInit_setsValueCorrectly() {
let subject = Cookie(name: "Foo", value: "Bar")
XCTAssertEqual(subject.value, "Bar")
}

func testInit_setsExpiresCorrectly() {
let subject = Cookie(name: "Foo", value: "Bar", expires: "Wed, 20 Jul 2016 13:20:15 GMT")
XCTAssertEqual(subject.expires, "Wed, 20 Jul 2016 13:20:15 GMT")
}

func testInit_setsMaxAgeCorrectly() {
let subject = Cookie(name: "Foo", value: "Bar", maxAge: 123456789)
XCTAssertEqual(subject.maxAge, 123456789)
}

func testInit_setsDomainCorrectly() {
let subject = Cookie(name: "Foo", value: "Bar", domain: "foo.bar.baz")
XCTAssertEqual(subject.domain, "foo.bar.baz")
}

func testInit_setsPathCorrectly() {
let subject = Cookie(name: "Foo", value: "Bar", path: "/baz")
XCTAssertEqual(subject.path, "/baz")
}

func testInit_defaultsToInsecure() {
let subject = Cookie(name: "Foo", value: "Bar")
XCTAssertFalse(subject.secure)
}

func testInit_setsSecureCorrectly() {
let subject = Cookie(name: "Foo", value: "Bar", secure: true)
XCTAssertTrue(subject.secure)
}

func testInit_defaultsToNonHTTPOnly() {
let subject = Cookie(name: "Foo", value: "Bar")
XCTAssertFalse(subject.HTTPOnly)
}

func testInit_setsHTTPOnlyCorrectly() {
let subject = Cookie(name: "Foo", value: "Bar", HTTPOnly: true)
XCTAssertTrue(subject.HTTPOnly)
}

func testHashValue_usesNamesHash() {
let subject = Cookie(name: "Foo", value: "Bar")
XCTAssertEqual(subject.hashValue, "Foo".hashValue)
}

func testEquality_reliesSolelyOnName() {
let subject1 = Cookie(name: "Foo", value: "Bar")
let subject2 = Cookie(name: "Baz", value: "Bar")
let subject3 = Cookie(name: "Foo", value: "Baz")
XCTAssertEqual(subject1, subject3)
XCTAssertNotEqual(subject1, subject2)
XCTAssertNotEqual(subject2, subject3)
}

func testSerialize_producesExpectedOutput() {
var subject = Cookie(name: "Foo", value: "Bar")
XCTAssertEqual(subject.serialize(), "Foo=Bar")
subject.expires = "Wed, 20 Jul 2016 09:00:15 GMT"
XCTAssertEqual(subject.serialize(), "Foo=Bar; Expires=Wed, 20 Jul 2016 09:00:15 GMT")
subject.path = "/bar/food/yum"
XCTAssertEqual(subject.serialize(), "Foo=Bar; Expires=Wed, 20 Jul 2016 09:00:15 GMT; Path=/bar/food/yum")
subject.domain = "vapor.qutheory.io"
XCTAssertEqual(subject.serialize(), "Foo=Bar; Expires=Wed, 20 Jul 2016 09:00:15 GMT; Domain=vapor.qutheory.io; Path=/bar/food/yum")
subject.maxAge = 600
XCTAssertEqual(subject.serialize(), "Foo=Bar; Expires=Wed, 20 Jul 2016 09:00:15 GMT; Max-Age=600; Domain=vapor.qutheory.io; Path=/bar/food/yum")
subject.secure = true
XCTAssertEqual(subject.serialize(), "Foo=Bar; Expires=Wed, 20 Jul 2016 09:00:15 GMT; Max-Age=600; Domain=vapor.qutheory.io; Path=/bar/food/yum; Secure")
subject.HTTPOnly = true
XCTAssertEqual(subject.serialize(), "Foo=Bar; Expires=Wed, 20 Jul 2016 09:00:15 GMT; Max-Age=600; Domain=vapor.qutheory.io; Path=/bar/food/yum; Secure; HttpOnly")
}
}