16
16
import XCTest
17
17
18
18
class CloudwatchTests : XCTestCase {
19
- static let scheduledEventPayload = """
20
- {
21
- " id " : " cdc73f9d-aea9-11e3-9d5a-835b769c0d9c " ,
22
- " detail-type " : " Scheduled Event " ,
23
- " source " : " aws.events " ,
24
- " account " : " 123456789012 " ,
25
- " time " : " 1970-01-01T00:00:00Z " ,
26
- " region " : " us-east-1 " ,
27
- " resources " : [
28
- " arn:aws:events:us-east-1:123456789012:rule/ExampleRule "
29
- ],
30
- " detail " : {}
19
+ static func eventPayload( type: String , details: String ) -> String {
20
+ """
21
+ {
22
+ " id " : " cdc73f9d-aea9-11e3-9d5a-835b769c0d9c " ,
23
+ " detail-type " : " \( type) " ,
24
+ " source " : " aws.events " ,
25
+ " account " : " 123456789012 " ,
26
+ " time " : " 1970-01-01T00:00:00Z " ,
27
+ " region " : " us-east-1 " ,
28
+ " resources " : [
29
+ " arn:aws:events:us-east-1:123456789012:rule/ExampleRule "
30
+ ],
31
+ " detail " : \( details)
32
+ }
33
+ """
31
34
}
32
- """
33
35
34
36
func testScheduledEventFromJSON( ) {
35
- let data = CloudwatchTests . scheduledEventPayload. data ( using: . utf8) !
36
- var maybeEvent : Cloudwatch . Event ?
37
- XCTAssertNoThrow ( maybeEvent = try JSONDecoder ( ) . decode ( Cloudwatch . Event. self, from: data) )
37
+ let payload = CloudwatchTests . eventPayload ( type: Cloudwatch . ScheduledEvent. name, details: " {} " )
38
+ let data = payload. data ( using: . utf8) !
39
+ var maybeEvent : Cloudwatch . ScheduledEvent ?
40
+ XCTAssertNoThrow ( maybeEvent = try JSONDecoder ( ) . decode ( Cloudwatch . ScheduledEvent. self, from: data) )
41
+
42
+ guard let event = maybeEvent else {
43
+ return XCTFail ( " Expected to have an event " )
44
+ }
45
+
46
+ XCTAssertEqual ( event. id, " cdc73f9d-aea9-11e3-9d5a-835b769c0d9c " )
47
+ XCTAssertEqual ( event. source, " aws.events " )
48
+ XCTAssertEqual ( event. accountId, " 123456789012 " )
49
+ XCTAssertEqual ( event. time, Date ( timeIntervalSince1970: 0 ) )
50
+ XCTAssertEqual ( event. region, . us_east_1)
51
+ XCTAssertEqual ( event. resources, [ " arn:aws:events:us-east-1:123456789012:rule/ExampleRule " ] )
52
+ }
53
+
54
+ func testEC2InstanceStateChangeNotificationEventFromJSON( ) {
55
+ let payload = CloudwatchTests . eventPayload ( type: Cloudwatch . EC2. InstanceStateChangeNotificationEvent. name,
56
+ details: " { \" instance-id \" : \" 0 \" , \" state \" : \" stopping \" } " )
57
+ let data = payload. data ( using: . utf8) !
58
+ var maybeEvent : Cloudwatch . EC2 . InstanceStateChangeNotificationEvent ?
59
+ XCTAssertNoThrow ( maybeEvent = try JSONDecoder ( ) . decode ( Cloudwatch . EC2. InstanceStateChangeNotificationEvent. self, from: data) )
60
+
61
+ guard let event = maybeEvent else {
62
+ return XCTFail ( " Expected to have an event " )
63
+ }
64
+
65
+ XCTAssertEqual ( event. id, " cdc73f9d-aea9-11e3-9d5a-835b769c0d9c " )
66
+ XCTAssertEqual ( event. source, " aws.events " )
67
+ XCTAssertEqual ( event. accountId, " 123456789012 " )
68
+ XCTAssertEqual ( event. time, Date ( timeIntervalSince1970: 0 ) )
69
+ XCTAssertEqual ( event. region, . us_east_1)
70
+ XCTAssertEqual ( event. resources, [ " arn:aws:events:us-east-1:123456789012:rule/ExampleRule " ] )
71
+ XCTAssertEqual ( event. detail. instanceId, " 0 " )
72
+ XCTAssertEqual ( event. detail. state, . stopping)
73
+ }
74
+
75
+ func testEC2SpotInstanceInterruptionNoticeEventFromJSON( ) {
76
+ let payload = CloudwatchTests . eventPayload ( type: Cloudwatch . EC2. SpotInstanceInterruptionNoticeEvent. name,
77
+ details: " { \" instance-id \" : \" 0 \" , \" instance-action \" : \" terminate \" } " )
78
+ let data = payload. data ( using: . utf8) !
79
+ var maybeEvent : Cloudwatch . EC2 . SpotInstanceInterruptionNoticeEvent ?
80
+ XCTAssertNoThrow ( maybeEvent = try JSONDecoder ( ) . decode ( Cloudwatch . EC2. SpotInstanceInterruptionNoticeEvent. self, from: data) )
81
+
82
+ guard let event = maybeEvent else {
83
+ return XCTFail ( " Expected to have an event " )
84
+ }
85
+
86
+ XCTAssertEqual ( event. id, " cdc73f9d-aea9-11e3-9d5a-835b769c0d9c " )
87
+ XCTAssertEqual ( event. source, " aws.events " )
88
+ XCTAssertEqual ( event. accountId, " 123456789012 " )
89
+ XCTAssertEqual ( event. time, Date ( timeIntervalSince1970: 0 ) )
90
+ XCTAssertEqual ( event. region, . us_east_1)
91
+ XCTAssertEqual ( event. resources, [ " arn:aws:events:us-east-1:123456789012:rule/ExampleRule " ] )
92
+ XCTAssertEqual ( event. detail. instanceId, " 0 " )
93
+ XCTAssertEqual ( event. detail. action, . terminate)
94
+ }
95
+
96
+ func testCustomEventFromJSON( ) {
97
+ struct Custom : Decodable {
98
+ let name : String
99
+ }
100
+
101
+ Cloudwatch . registerDetailPayload ( label: " Custom " , type: Custom . self)
102
+
103
+ let payload = CloudwatchTests . eventPayload ( type: " Custom " , details: " { \" name \" : \" foo \" } " )
104
+ let data = payload. data ( using: . utf8) !
105
+ var maybeEvent : Cloudwatch . Event < Custom > ?
106
+ XCTAssertNoThrow ( maybeEvent = try JSONDecoder ( ) . decode ( Cloudwatch . Event< Custom> . self , from: data) )
38
107
39
108
guard let event = maybeEvent else {
40
- XCTFail ( " Expected to have an event " ) ; return
109
+ return XCTFail ( " Expected to have an event " )
41
110
}
42
111
43
112
XCTAssertEqual ( event. id, " cdc73f9d-aea9-11e3-9d5a-835b769c0d9c " )
@@ -46,9 +115,23 @@ class CloudwatchTests: XCTestCase {
46
115
XCTAssertEqual ( event. time, Date ( timeIntervalSince1970: 0 ) )
47
116
XCTAssertEqual ( event. region, . us_east_1)
48
117
XCTAssertEqual ( event. resources, [ " arn:aws:events:us-east-1:123456789012:rule/ExampleRule " ] )
118
+ XCTAssertEqual ( event. detail. name, " foo " )
119
+ }
120
+
121
+ func testUnregistredType( ) {
122
+ let payload = CloudwatchTests . eventPayload ( type: UUID ( ) . uuidString, details: " {} " )
123
+ let data = payload. data ( using: . utf8) !
124
+ XCTAssertThrowsError ( try JSONDecoder ( ) . decode ( Cloudwatch . ScheduledEvent. self, from: data) ) { error in
125
+ XCTAssert ( error is Cloudwatch . UnknownPayload , " expected UnknownPayload but recieved \( error) " )
126
+ }
127
+ }
49
128
50
- guard case Cloudwatch . Event . Detail . scheduled = event. detail else {
51
- XCTFail ( " Unexpected detail: \( event. detail) " ) ; return
129
+ func testTypeMismatch( ) {
130
+ let payload = CloudwatchTests . eventPayload ( type: Cloudwatch . EC2. InstanceStateChangeNotificationEvent. name,
131
+ details: " { \" instance-id \" : \" 0 \" , \" state \" : \" stopping \" } " )
132
+ let data = payload. data ( using: . utf8) !
133
+ XCTAssertThrowsError ( try JSONDecoder ( ) . decode ( Cloudwatch . ScheduledEvent. self, from: data) ) { error in
134
+ XCTAssert ( error is Cloudwatch . PayloadTypeMismatch , " expected PayloadTypeMismatch but recieved \( error) " )
52
135
}
53
136
}
54
137
}
0 commit comments