Skip to content

Commit edbfa79

Browse files
authored
Updated S3.Event (swift-server#195)
motivation: support s3:ObjectRemoved:* event changes: * Changed the S3.Event object size field to an optional due to the missing field on a s3:ObjectRemoved:* event * Added one additional test to check propper json decoding
1 parent 19a9f92 commit edbfa79

File tree

2 files changed

+77
-4
lines changed

2 files changed

+77
-4
lines changed

Sources/AWSLambdaEvents/S3.swift

+4-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ public enum S3 {
6969

7070
public struct Object: Codable {
7171
public let key: String
72-
public let size: UInt64
72+
/// The object's size in bytes.
73+
///
74+
/// Note: This property is available for all event types except "ObjectRemoved:*"
75+
public let size: UInt64?
7376
public let urlDecodedKey: String?
7477
public let versionId: String?
7578
public let eTag: String

Tests/AWSLambdaEventsTests/S3Tests.swift

+73-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import XCTest
1717

1818
class S3Tests: XCTestCase {
19-
static let eventBody = """
19+
static let eventBodyObjectCreated = """
2020
{
2121
"Records": [
2222
{
@@ -57,8 +57,49 @@ class S3Tests: XCTestCase {
5757
}
5858
"""
5959

60-
func testSimpleEventFromJSON() {
61-
let data = S3Tests.eventBody.data(using: .utf8)!
60+
// A S3 ObjectRemoved:* event does not contain the object size
61+
static let eventBodyObjectRemoved = """
62+
{
63+
"Records": [
64+
{
65+
"eventVersion":"2.1",
66+
"eventSource":"aws:s3",
67+
"awsRegion":"eu-central-1",
68+
"eventTime":"2020-01-13T09:25:40.621Z",
69+
"eventName":"ObjectRemoved:DeleteMarkerCreated",
70+
"userIdentity":{
71+
"principalId":"AWS:AAAAAAAJ2MQ4YFQZ7AULJ"
72+
},
73+
"requestParameters":{
74+
"sourceIPAddress":"123.123.123.123"
75+
},
76+
"responseElements":{
77+
"x-amz-request-id":"01AFA1430E18C358",
78+
"x-amz-id-2":"JsbNw6sHGFwgzguQjbYcew//bfAeZITyTYLfjuu1U4QYqCq5CPlSyYLtvWQS+gw0RxcroItGwm8="
79+
},
80+
"s3":{
81+
"s3SchemaVersion":"1.0",
82+
"configurationId":"98b55bc4-3c0c-4007-b727-c6b77a259dde",
83+
"bucket":{
84+
"name":"eventsources",
85+
"ownerIdentity":{
86+
"principalId":"AAAAAAAAAAAAAA"
87+
},
88+
"arn":"arn:aws:s3:::eventsources"
89+
},
90+
"object":{
91+
"key":"Hi.md",
92+
"eTag":"91a7f2c3ae81bcc6afef83979b463f0e",
93+
"sequencer":"005E1C37948E783A6E"
94+
}
95+
}
96+
}
97+
]
98+
}
99+
"""
100+
101+
func testObjectCreatedEvent() {
102+
let data = S3Tests.eventBodyObjectCreated.data(using: .utf8)!
62103
var event: S3.Event?
63104
XCTAssertNoThrow(event = try JSONDecoder().decode(S3.Event.self, from: data))
64105

@@ -85,4 +126,33 @@ class S3Tests: XCTestCase {
85126
XCTAssertEqual(record.s3.object.eTag, "91a7f2c3ae81bcc6afef83979b463f0e")
86127
XCTAssertEqual(record.s3.object.sequencer, "005E1C37948E783A6E")
87128
}
129+
130+
func testObjectRemovedEvent() {
131+
let data = S3Tests.eventBodyObjectRemoved.data(using: .utf8)!
132+
var event: S3.Event?
133+
XCTAssertNoThrow(event = try JSONDecoder().decode(S3.Event.self, from: data))
134+
135+
guard let record = event?.records.first else {
136+
XCTFail("Expected to have one record")
137+
return
138+
}
139+
140+
XCTAssertEqual(record.eventVersion, "2.1")
141+
XCTAssertEqual(record.eventSource, "aws:s3")
142+
XCTAssertEqual(record.awsRegion, .eu_central_1)
143+
XCTAssertEqual(record.eventName, "ObjectRemoved:DeleteMarkerCreated")
144+
XCTAssertEqual(record.eventTime, Date(timeIntervalSince1970: 1_578_907_540.621))
145+
XCTAssertEqual(record.userIdentity, S3.UserIdentity(principalId: "AWS:AAAAAAAJ2MQ4YFQZ7AULJ"))
146+
XCTAssertEqual(record.requestParameters, S3.RequestParameters(sourceIPAddress: "123.123.123.123"))
147+
XCTAssertEqual(record.responseElements.count, 2)
148+
XCTAssertEqual(record.s3.schemaVersion, "1.0")
149+
XCTAssertEqual(record.s3.configurationId, "98b55bc4-3c0c-4007-b727-c6b77a259dde")
150+
XCTAssertEqual(record.s3.bucket.name, "eventsources")
151+
XCTAssertEqual(record.s3.bucket.ownerIdentity, S3.UserIdentity(principalId: "AAAAAAAAAAAAAA"))
152+
XCTAssertEqual(record.s3.bucket.arn, "arn:aws:s3:::eventsources")
153+
XCTAssertEqual(record.s3.object.key, "Hi.md")
154+
XCTAssertNil(record.s3.object.size)
155+
XCTAssertEqual(record.s3.object.eTag, "91a7f2c3ae81bcc6afef83979b463f0e")
156+
XCTAssertEqual(record.s3.object.sequencer, "005E1C37948E783A6E")
157+
}
88158
}

0 commit comments

Comments
 (0)