forked from vapor/postgres-nio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPrepareStatementStateMachineTests.swift
78 lines (61 loc) · 3.82 KB
/
PrepareStatementStateMachineTests.swift
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
import XCTest
import NIOEmbedded
@testable import PostgresNIO
class PrepareStatementStateMachineTests: XCTestCase {
func testCreatePreparedStatementReturningRowDescription() {
var state = ConnectionStateMachine.readyForQuery()
let promise = EmbeddedEventLoop().makePromise(of: RowDescription?.self)
promise.fail(PSQLError.uncleanShutdown) // we don't care about the error at all.
let name = "haha"
let query = #"SELECT id FROM users WHERE id = $1 "#
let prepareStatementContext = ExtendedQueryContext(
name: name, query: query, bindingDataTypes: [], logger: .psqlTest, promise: promise
)
XCTAssertEqual(state.enqueue(task: .extendedQuery(prepareStatementContext)),
.sendParseDescribeSync(name: name, query: query, bindingDataTypes: []))
XCTAssertEqual(state.parseCompleteReceived(), .wait)
XCTAssertEqual(state.parameterDescriptionReceived(.init(dataTypes: [.int8])), .wait)
let columns: [RowDescription.Column] = [
.init(name: "id", tableOID: 0, columnAttributeNumber: 0, dataType: .int8, dataTypeSize: 8, dataTypeModifier: -1, format: .binary)
]
XCTAssertEqual(state.rowDescriptionReceived(.init(columns: columns)),
.succeedPreparedStatementCreation(promise, with: .init(columns: columns)))
XCTAssertEqual(state.readyForQueryReceived(.idle), .fireEventReadyForQuery)
}
func testCreatePreparedStatementReturningNoData() {
var state = ConnectionStateMachine.readyForQuery()
let promise = EmbeddedEventLoop().makePromise(of: RowDescription?.self)
promise.fail(PSQLError.uncleanShutdown) // we don't care about the error at all.
let name = "haha"
let query = #"DELETE FROM users WHERE id = $1 "#
let prepareStatementContext = ExtendedQueryContext(
name: name, query: query, bindingDataTypes: [], logger: .psqlTest, promise: promise
)
XCTAssertEqual(state.enqueue(task: .extendedQuery(prepareStatementContext)),
.sendParseDescribeSync(name: name, query: query, bindingDataTypes: []))
XCTAssertEqual(state.parseCompleteReceived(), .wait)
XCTAssertEqual(state.parameterDescriptionReceived(.init(dataTypes: [.int8])), .wait)
XCTAssertEqual(state.noDataReceived(),
.succeedPreparedStatementCreation(promise, with: nil))
XCTAssertEqual(state.readyForQueryReceived(.idle), .fireEventReadyForQuery)
}
func testErrorReceivedAfter() {
var state = ConnectionStateMachine.readyForQuery()
let promise = EmbeddedEventLoop().makePromise(of: RowDescription?.self)
promise.fail(PSQLError.uncleanShutdown) // we don't care about the error at all.
let name = "haha"
let query = #"DELETE FROM users WHERE id = $1 "#
let prepareStatementContext = ExtendedQueryContext(
name: name, query: query, bindingDataTypes: [], logger: .psqlTest, promise: promise
)
XCTAssertEqual(state.enqueue(task: .extendedQuery(prepareStatementContext)),
.sendParseDescribeSync(name: name, query: query, bindingDataTypes: []))
XCTAssertEqual(state.parseCompleteReceived(), .wait)
XCTAssertEqual(state.parameterDescriptionReceived(.init(dataTypes: [.int8])), .wait)
XCTAssertEqual(state.noDataReceived(),
.succeedPreparedStatementCreation(promise, with: nil))
XCTAssertEqual(state.readyForQueryReceived(.idle), .fireEventReadyForQuery)
XCTAssertEqual(state.authenticationMessageReceived(.ok),
.closeConnectionAndCleanup(.init(action: .close, tasks: [], error: .unexpectedBackendMessage(.authentication(.ok)), closePromise: nil)))
}
}