Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Sources/HTTPTransition.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,16 @@ public struct HTTPTransition : TransitionType {
public var hashValue:Int {
return uri.hashValue
}

public var isIdempotent: Bool {
let nonIdempotent = ["POST", "PATCH"]
return !nonIdempotent.contains(method)
}

public var isSafe: Bool {
let safe = ["GET", "OPTIONS", "HEAD"]
return safe.contains(method)
}
}

public func ==(lhs:HTTPTransition, rhs:HTTPTransition) -> Bool {
Expand Down
102 changes: 102 additions & 0 deletions Tests/HTTPTransitionTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,106 @@ class HTTPTransitionTests : XCTestCase {
let transition2 = HTTPTransition(uri:"/self/")
XCTAssertEqual(transition1.hashValue, transition2.hashValue)
}

// MARK: Idempotency

func testGETMethodIsIdempotent() {
var transition = HTTPTransition(uri: "/")
transition.method = "GET"

XCTAssertTrue(transition.isIdempotent)
}

func testOPTIONSMethodIsIdempotent() {
var transition = HTTPTransition(uri: "/")
transition.method = "OPTIONS"

XCTAssertTrue(transition.isIdempotent)
}

func testHEADMethodIsIdempotent() {
var transition = HTTPTransition(uri: "/")
transition.method = "HEAD"

XCTAssertTrue(transition.isIdempotent)
}

func testPUTMethodIsIdempotent() {
var transition = HTTPTransition(uri: "/")
transition.method = "PUT"

XCTAssertTrue(transition.isIdempotent)
}

func testDELETEMethodIsIdempotent() {
var transition = HTTPTransition(uri: "/")
transition.method = "DELETE"

XCTAssertTrue(transition.isIdempotent)
}

func testPOSTMethodIsNotIdempotent() {
var transition = HTTPTransition(uri: "/")
transition.method = "POST"

XCTAssertFalse(transition.isIdempotent)
}

func testPATCHMethodIsNotIdempotent() {
var transition = HTTPTransition(uri: "/")
transition.method = "PATCH"

XCTAssertFalse(transition.isIdempotent)
}

// MARK: Safe

func testGETMethodIsSafe() {
var transition = HTTPTransition(uri: "/")
transition.method = "GET"

XCTAssertTrue(transition.isSafe)
}

func testOPTIONSMethodIsSafe() {
var transition = HTTPTransition(uri: "/")
transition.method = "OPTIONS"

XCTAssertTrue(transition.isSafe)
}

func testHEADMethodIsSafe() {
var transition = HTTPTransition(uri: "/")
transition.method = "HEAD"

XCTAssertTrue(transition.isSafe)
}

func testPUTMethodIsNotSafe() {
var transition = HTTPTransition(uri: "/")
transition.method = "PUT"

XCTAssertFalse(transition.isSafe)
}

func testDELETEMethodIsNotSafe() {
var transition = HTTPTransition(uri: "/")
transition.method = "DELETE"

XCTAssertFalse(transition.isSafe)
}

func testPOSTMethodIsNotSafe() {
var transition = HTTPTransition(uri: "/")
transition.method = "POST"

XCTAssertFalse(transition.isSafe)
}

func testPATCHMethodIsNotSafe() {
var transition = HTTPTransition(uri: "/")
transition.method = "PATCH"

XCTAssertFalse(transition.isSafe)
}
}