diff --git a/OmiseGO.xcodeproj/project.pbxproj b/OmiseGO.xcodeproj/project.pbxproj index 294cba2..abd69d2 100644 --- a/OmiseGO.xcodeproj/project.pbxproj +++ b/OmiseGO.xcodeproj/project.pbxproj @@ -47,6 +47,8 @@ 034FA0441FA31C930033B8D1 /* LogoutFixtureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 034FA0431FA31C930033B8D1 /* LogoutFixtureTests.swift */; }; 0355969920453069000E38DA /* TransactionSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0355969820453069000E38DA /* TransactionSource.swift */; }; 0355969B2045315F000E38DA /* TransactionExchange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0355969A2045315F000E38DA /* TransactionExchange.swift */; }; + 036128A020872E7D00E13514 /* Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0361289F20872E7D00E13514 /* Account.swift */; }; + 036128A22087315D00E13514 /* Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 036128A12087315D00E13514 /* Avatar.swift */; }; 0365DE832028508900F7B42E /* TransactionRequestParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0365DE822028508900F7B42E /* TransactionRequestParams.swift */; }; 0365DE8520285FE700F7B42E /* TransactionRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0365DE8420285FE700F7B42E /* TransactionRequest.swift */; }; 0365F4F120565011000DA61A /* Listenable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0365F4F020565011000DA61A /* Listenable.swift */; }; @@ -173,6 +175,8 @@ 034FA0431FA31C930033B8D1 /* LogoutFixtureTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogoutFixtureTests.swift; sourceTree = ""; }; 0355969820453069000E38DA /* TransactionSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionSource.swift; sourceTree = ""; }; 0355969A2045315F000E38DA /* TransactionExchange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionExchange.swift; sourceTree = ""; }; + 0361289F20872E7D00E13514 /* Account.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Account.swift; sourceTree = ""; }; + 036128A12087315D00E13514 /* Avatar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Avatar.swift; sourceTree = ""; }; 0365DE822028508900F7B42E /* TransactionRequestParams.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionRequestParams.swift; sourceTree = ""; }; 0365DE8420285FE700F7B42E /* TransactionRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionRequest.swift; sourceTree = ""; }; 0365F4F020565011000DA61A /* Listenable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Listenable.swift; sourceTree = ""; }; @@ -414,6 +418,8 @@ 039DA976203FAB0600CCC56A /* TransactionListParams.swift */, 039DA972203FA72800CCC56A /* Transaction.swift */, 039DA978203FB53F00CCC56A /* Pagination.swift */, + 0361289F20872E7D00E13514 /* Account.swift */, + 036128A12087315D00E13514 /* Avatar.swift */, ); path = Models; sourceTree = ""; @@ -752,6 +758,7 @@ 037032AC1FBBE6B100DBCDDD /* Reponse.swift in Sources */, 0377EBAF20564E7A0036A9D6 /* SocketMessage.swift in Sources */, 039DA975203FA94100CCC56A /* PaginationParams.swift in Sources */, + 036128A22087315D00E13514 /* Avatar.swift in Sources */, 0365DE832028508900F7B42E /* TransactionRequestParams.swift in Sources */, 037BAA9B205F701F004A3952 /* RequestBuilder.swift in Sources */, 0313D6D820317696003E99BA /* QRScannerView.swift in Sources */, @@ -761,6 +768,7 @@ 037032AF1FBBE6B100DBCDDD /* Retrievable.swift in Sources */, 0313D6DC20317696003E99BA /* QRScannerViewController.swift in Sources */, 037032B11FBBE6B100DBCDDD /* ClientConfiguration.swift in Sources */, + 036128A020872E7D00E13514 /* Account.swift in Sources */, 0355969B2045315F000E38DA /* TransactionExchange.swift in Sources */, 037032B01FBBE6B100DBCDDD /* Listable.swift in Sources */, 03E8E6732060C5320036CC9E /* SocketEvent.swift in Sources */, diff --git a/OmiseGOTests/CodingTests/DecodeTests.swift b/OmiseGOTests/CodingTests/DecodeTests.swift index 0ba603d..af0bfee 100644 --- a/OmiseGOTests/CodingTests/DecodeTests.swift +++ b/OmiseGOTests/CodingTests/DecodeTests.swift @@ -284,6 +284,9 @@ class DecodeTests: XCTestCase { XCTAssertEqual(decodedData.mintedToken.id, "BTC:861020af-17b6-49ee-a0cb-661a4d2d1f95") XCTAssertEqual(decodedData.amount, 1337) XCTAssertEqual(decodedData.address, "3b7f1c68-e3bd-4f8f-9916-4af19be95d00") + let user = decodedData.user! + XCTAssertEqual(user.id, "6f56efa1-caf9-4348-8e0f-f5af283f17ee") + XCTAssertNil(decodedData.account) XCTAssertEqual(decodedData.correlationId, "31009545-db10-4287-82f4-afb46d9741d8") XCTAssertEqual(decodedData.status, .valid) XCTAssertEqual(decodedData.socketTopic, "transaction_request:8eb0160e-1c96-481a-88e1-899399cc84dc") @@ -314,10 +317,11 @@ class DecodeTests: XCTestCase { XCTAssertEqual(mintedToken.subUnitToUnit, 100000) XCTAssertEqual(decodedData.correlationId, "31009545-db10-4287-82f4-afb46d9741d8") XCTAssertEqual(decodedData.idempotencyToken, "31009545-db10-4287-82f4-afb46d9741d8") - XCTAssertEqual(decodedData.transactionId, "6ca40f34-6eaa-43e1-b2e1-a94ff3660988") - XCTAssertEqual(decodedData.userId, "6f56efa1-caf9-4348-8e0f-f5af283f17ee") - XCTAssertNil(decodedData.accountId) - XCTAssertEqual(decodedData.transactionRequestId, "907056a4-fc2d-47cb-af19-5e73aade7ece") + let transaction = decodedData.transaction! + XCTAssertEqual(transaction.id, "6ca40f34-6eaa-43e1-b2e1-a94ff366098") + let user = decodedData.user! + XCTAssertEqual(user.id, "6f56efa1-caf9-4348-8e0f-f5af283f17ee") + XCTAssertNil(decodedData.account) let transactionRequest = decodedData.transactionRequest XCTAssertEqual(transactionRequest.id, "907056a4-fc2d-47cb-af19-5e73aade7ece") XCTAssertEqual(decodedData.address, "3b7f1c68-e3bd-4f8f-9916-4af19be95d00") @@ -458,4 +462,36 @@ class DecodeTests: XCTestCase { } } + func testAccountDecoding() { + do { + let jsonData = try self.jsonData(withFileName: "account") + let decodedData = try self.jsonDecoder.decode(Account.self, from: jsonData) + XCTAssertEqual(decodedData.id, "acc_01CA2P8JQANS5ATY5GJ5ETMJCF") + XCTAssertEqual(decodedData.parentId, "acc_01CA26PKGE49AABZD6K6MSHN0Y") + XCTAssertEqual(decodedData.name, "Account Name") + XCTAssertEqual(decodedData.description, "The account description") + XCTAssertEqual(decodedData.isMaster, false) + let avatar = decodedData.avatar + XCTAssertEqual(avatar.original, "original_url") + XCTAssertEqual(decodedData.metadata.count, 0) + XCTAssertEqual(decodedData.createdAt, "2018-01-01T00:00:00Z".toDate(withFormat: "yyyy-MM-dd'T'HH:mm:ssZ")) + XCTAssertEqual(decodedData.updatedAt, "2018-01-01T10:00:00Z".toDate(withFormat: "yyyy-MM-dd'T'HH:mm:ssZ")) + } catch let thrownError { + XCTFail(thrownError.localizedDescription) + } + } + + func testAvatarDecoding() { + do { + let jsonData = try self.jsonData(withFileName: "avatar") + let decodedData = try self.jsonDecoder.decode(Avatar.self, from: jsonData) + XCTAssertEqual(decodedData.original, "original_url") + XCTAssertEqual(decodedData.large, "large_url") + XCTAssertEqual(decodedData.small, "small_url") + XCTAssertEqual(decodedData.thumb, "thumb_url") + } catch let thrownError { + XCTFail(thrownError.localizedDescription) + } + } + } diff --git a/OmiseGOTests/CodingTests/EncodeTests.swift b/OmiseGOTests/CodingTests/EncodeTests.swift index 27051e5..80cf664 100644 --- a/OmiseGOTests/CodingTests/EncodeTests.swift +++ b/OmiseGOTests/CodingTests/EncodeTests.swift @@ -243,6 +243,8 @@ class EncodeTests: XCTestCase { mintedToken: StubGenerator.mintedToken(id: "BTC:5ee328ec-b9e2-46a5-88bb-c8b15ea6b3c1"), amount: 1337, address: "3bfe0ff7-f43e-4ac6-bdf9-c4a290c40d0d", + user: StubGenerator.user(), + account: nil, correlationId: "31009545-db10-4287-82f4-afb46d9741d8", status: .valid, socketTopic: "transaction_request:0a8a4a98-794b-419e-b92d-514e83657e75", diff --git a/OmiseGOTests/FixtureTests/Fixtures/fixture/me.approve_transaction_consumption.json b/OmiseGOTests/FixtureTests/Fixtures/fixture/me.approve_transaction_consumption.json index f4e1f50..1a77cbf 100644 --- a/OmiseGOTests/FixtureTests/Fixtures/fixture/me.approve_transaction_consumption.json +++ b/OmiseGOTests/FixtureTests/Fixtures/fixture/me.approve_transaction_consumption.json @@ -15,10 +15,42 @@ }, "correlation_id": "31009545-db10-4287-82f4-afb46d9741d8", "idempotency_token": "31009545-db10-4287-82f4-afb46d9741d8", - "transaction_id": "6ca40f34-6eaa-43e1-b2e1-a94ff3660988", - "user_id": "6f56efa1-caf9-4348-8e0f-f5af283f17ee", - "account_id": null, - "transaction_request_id": "907056a4-fc2d-47cb-af19-5e73aade7ece", + "transaction": { + "object": "transaction", + "id": "6ca40f34-6eaa-43e1-b2e1-a94ff366098", + "from": { + "object": "transaction_source", + "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "amount": 1337, + "minted_token": { + "object": "minted_token", + "id": "BTC:861020af-17b6-49ee-a0cb-661a4d2d1f95", + "symbol": "BTC", + "name": "Bitcoin", + "subunit_to_unit": 100000 + } + }, + "to": { + "object": "transaction_source", + "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "amount": 1337, + "minted_token": { + "object": "minted_token", + "id": "BTC:861020af-17b6-49ee-a0cb-661a4d2d1f95", + "symbol": "BTC", + "name": "Bitcoin", + "subunit_to_unit": 100000 + } + }, + "exchange": { + "object": "exchange", + "rate": 1 + }, + "metadata": {}, + "status": "confirmed", + "created_at": "2018-01-01T00:00:00Z", + "updated_at": "2018-01-01T10:00:00Z" + }, "transaction_request": { "object": "transaction_request", "type": "receive", @@ -45,8 +77,16 @@ "metadata": {} }, "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "user": { + "object": "user", + "id": "6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "provider_user_id": "a_provider_user_id", + "username": "john.doe@example.com", + "socket_topic": "user:6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "metadata": {} + }, + "accountId": null, "socket_topic": "transaction_consumption:8eb0160e-1c96-481a-88e1-899399cc84dc", - "finalized_at": "2018-01-01T00:00:00Z", "expiration_date": "2019-01-01T00:00:00Z", "approved_at": "2018-01-02T00:00:00Z", "rejected_at": null, @@ -56,4 +96,5 @@ "created_at": "2018-01-01T00:00:00Z", "metadata": {} } + } diff --git a/OmiseGOTests/FixtureTests/Fixtures/fixture/me.consume_transaction_request.json b/OmiseGOTests/FixtureTests/Fixtures/fixture/me.consume_transaction_request.json index 66770b2..b662405 100644 --- a/OmiseGOTests/FixtureTests/Fixtures/fixture/me.consume_transaction_request.json +++ b/OmiseGOTests/FixtureTests/Fixtures/fixture/me.consume_transaction_request.json @@ -15,10 +15,42 @@ }, "correlation_id": "31009545-db10-4287-82f4-afb46d9741d8", "idempotency_token": "31009545-db10-4287-82f4-afb46d9741d8", - "transaction_id": "6ca40f34-6eaa-43e1-b2e1-a94ff3660988", - "user_id": "6f56efa1-caf9-4348-8e0f-f5af283f17ee", - "account_id": null, - "transaction_request_id": "907056a4-fc2d-47cb-af19-5e73aade7ece", + "transaction": { + "object": "transaction", + "id": "6ca40f34-6eaa-43e1-b2e1-a94ff366098", + "from": { + "object": "transaction_source", + "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "amount": 1337, + "minted_token": { + "object": "minted_token", + "id": "BTC:861020af-17b6-49ee-a0cb-661a4d2d1f95", + "symbol": "BTC", + "name": "Bitcoin", + "subunit_to_unit": 100000 + } + }, + "to": { + "object": "transaction_source", + "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "amount": 1337, + "minted_token": { + "object": "minted_token", + "id": "BTC:861020af-17b6-49ee-a0cb-661a4d2d1f95", + "symbol": "BTC", + "name": "Bitcoin", + "subunit_to_unit": 100000 + } + }, + "exchange": { + "object": "exchange", + "rate": 1 + }, + "metadata": {}, + "status": "confirmed", + "created_at": "2018-01-01T00:00:00Z", + "updated_at": "2018-01-01T10:00:00Z" + }, "transaction_request": { "object": "transaction_request", "type": "receive", @@ -45,6 +77,15 @@ "metadata": {} }, "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "user": { + "object": "user", + "id": "6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "provider_user_id": "a_provider_user_id", + "username": "john.doe@example.com", + "socket_topic": "user:6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "metadata": {} + }, + "accountId": null, "socket_topic": "transaction_consumption:8eb0160e-1c96-481a-88e1-899399cc84dc", "expiration_date": "2019-01-01T00:00:00Z", "approved_at": null, diff --git a/OmiseGOTests/FixtureTests/Fixtures/fixture/me.create_transaction_request.json b/OmiseGOTests/FixtureTests/Fixtures/fixture/me.create_transaction_request.json index 9d3e5bc..2f3e5eb 100644 --- a/OmiseGOTests/FixtureTests/Fixtures/fixture/me.create_transaction_request.json +++ b/OmiseGOTests/FixtureTests/Fixtures/fixture/me.create_transaction_request.json @@ -14,6 +14,15 @@ }, "amount": 1337, "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "user": { + "object": "user", + "id": "6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "provider_user_id": "a_provider_user_id", + "username": "john.doe@example.com", + "socket_topic": "user:6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "metadata": {} + }, + "accountId": null, "correlation_id": "31009545-db10-4287-82f4-afb46d9741d8", "status": "valid", "socket_topic": "transaction_request:8eb0160e-1c96-481a-88e1-899399cc84dc", @@ -26,4 +35,5 @@ "allow_amount_override": true, "metadata": {} } + } diff --git a/OmiseGOTests/FixtureTests/Fixtures/fixture/me.get_transaction_request.json b/OmiseGOTests/FixtureTests/Fixtures/fixture/me.get_transaction_request.json index 9d3e5bc..2f3e5eb 100644 --- a/OmiseGOTests/FixtureTests/Fixtures/fixture/me.get_transaction_request.json +++ b/OmiseGOTests/FixtureTests/Fixtures/fixture/me.get_transaction_request.json @@ -14,6 +14,15 @@ }, "amount": 1337, "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "user": { + "object": "user", + "id": "6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "provider_user_id": "a_provider_user_id", + "username": "john.doe@example.com", + "socket_topic": "user:6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "metadata": {} + }, + "accountId": null, "correlation_id": "31009545-db10-4287-82f4-afb46d9741d8", "status": "valid", "socket_topic": "transaction_request:8eb0160e-1c96-481a-88e1-899399cc84dc", @@ -26,4 +35,5 @@ "allow_amount_override": true, "metadata": {} } + } diff --git a/OmiseGOTests/FixtureTests/Fixtures/fixture/me.reject_transaction_consumption.json b/OmiseGOTests/FixtureTests/Fixtures/fixture/me.reject_transaction_consumption.json index daccaa7..2714147 100644 --- a/OmiseGOTests/FixtureTests/Fixtures/fixture/me.reject_transaction_consumption.json +++ b/OmiseGOTests/FixtureTests/Fixtures/fixture/me.reject_transaction_consumption.json @@ -15,10 +15,42 @@ }, "correlation_id": "31009545-db10-4287-82f4-afb46d9741d8", "idempotency_token": "31009545-db10-4287-82f4-afb46d9741d8", - "transaction_id": "6ca40f34-6eaa-43e1-b2e1-a94ff3660988", - "user_id": "6f56efa1-caf9-4348-8e0f-f5af283f17ee", - "account_id": null, - "transaction_request_id": "907056a4-fc2d-47cb-af19-5e73aade7ece", + "transaction": { + "object": "transaction", + "id": "6ca40f34-6eaa-43e1-b2e1-a94ff366098", + "from": { + "object": "transaction_source", + "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "amount": 1337, + "minted_token": { + "object": "minted_token", + "id": "BTC:861020af-17b6-49ee-a0cb-661a4d2d1f95", + "symbol": "BTC", + "name": "Bitcoin", + "subunit_to_unit": 100000 + } + }, + "to": { + "object": "transaction_source", + "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "amount": 1337, + "minted_token": { + "object": "minted_token", + "id": "BTC:861020af-17b6-49ee-a0cb-661a4d2d1f95", + "symbol": "BTC", + "name": "Bitcoin", + "subunit_to_unit": 100000 + } + }, + "exchange": { + "object": "exchange", + "rate": 1 + }, + "metadata": {}, + "status": "confirmed", + "created_at": "2018-01-01T00:00:00Z", + "updated_at": "2018-01-01T10:00:00Z" + }, "transaction_request": { "object": "transaction_request", "type": "receive", @@ -45,6 +77,15 @@ "metadata": {} }, "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "user": { + "object": "user", + "id": "6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "provider_user_id": "a_provider_user_id", + "username": "john.doe@example.com", + "socket_topic": "user:6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "metadata": {} + }, + "accountId": null, "socket_topic": "transaction_consumption:8eb0160e-1c96-481a-88e1-899399cc84dc", "expiration_date": "2019-01-01T00:00:00Z", "approved_at": null, diff --git a/OmiseGOTests/FixtureTests/Fixtures/objects/account.json b/OmiseGOTests/FixtureTests/Fixtures/objects/account.json new file mode 100644 index 0000000..5ca982e --- /dev/null +++ b/OmiseGOTests/FixtureTests/Fixtures/objects/account.json @@ -0,0 +1,17 @@ +{ + "object": "account", + "id": "acc_01CA2P8JQANS5ATY5GJ5ETMJCF", + "parent_id": "acc_01CA26PKGE49AABZD6K6MSHN0Y", + "name": "Account Name", + "description": "The account description", + "master": false, + "metadata": {}, + "avatar": { + "original": "original_url", + "large": "large_url", + "small": "small_url", + "thumb": "thumb_url" + }, + "created_at": "2018-01-01T00:00:00Z", + "updated_at": "2018-01-01T10:00:00Z" +} diff --git a/OmiseGOTests/FixtureTests/Fixtures/objects/avatar.json b/OmiseGOTests/FixtureTests/Fixtures/objects/avatar.json new file mode 100644 index 0000000..c6a6ec2 --- /dev/null +++ b/OmiseGOTests/FixtureTests/Fixtures/objects/avatar.json @@ -0,0 +1,6 @@ +{ + "original": "original_url", + "large": "large_url", + "small": "small_url", + "thumb": "thumb_url" +} diff --git a/OmiseGOTests/FixtureTests/Fixtures/objects/socket_response.json b/OmiseGOTests/FixtureTests/Fixtures/objects/socket_response.json index 92196df..ce070ca 100644 --- a/OmiseGOTests/FixtureTests/Fixtures/objects/socket_response.json +++ b/OmiseGOTests/FixtureTests/Fixtures/objects/socket_response.json @@ -19,10 +19,42 @@ }, "correlation_id": "31009545-db10-4287-82f4-afb46d9741d8", "idempotency_token": "31009545-db10-4287-82f4-afb46d9741d8", - "transaction_id": "6ca40f34-6eaa-43e1-b2e1-a94ff3660988", - "user_id": "6f56efa1-caf9-4348-8e0f-f5af283f17ee", - "account_id": null, - "transaction_request_id": "907056a4-fc2d-47cb-af19-5e73aade7ece", + "transaction": { + "object": "transaction", + "id": "6ca40f34-6eaa-43e1-b2e1-a94ff366098", + "from": { + "object": "transaction_source", + "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "amount": 1337, + "minted_token": { + "object": "minted_token", + "id": "BTC:861020af-17b6-49ee-a0cb-661a4d2d1f95", + "symbol": "BTC", + "name": "Bitcoin", + "subunit_to_unit": 100000 + } + }, + "to": { + "object": "transaction_source", + "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "amount": 1337, + "minted_token": { + "object": "minted_token", + "id": "BTC:861020af-17b6-49ee-a0cb-661a4d2d1f95", + "symbol": "BTC", + "name": "Bitcoin", + "subunit_to_unit": 100000 + } + }, + "exchange": { + "object": "exchange", + "rate": 1 + }, + "metadata": {}, + "status": "confirmed", + "created_at": "2018-01-01T00:00:00Z", + "updated_at": "2018-01-01T10:00:00Z" + }, "transaction_request": { "object": "transaction_request", "type": "receive", @@ -49,9 +81,17 @@ "metadata": {} }, "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "user": { + "object": "user", + "id": "6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "provider_user_id": "a_provider_user_id", + "username": "john.doe@example.com", + "socket_topic": "user:6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "metadata": {} + }, + "accountId": null, "socket_topic": "transaction_consumption:8eb0160e-1c96-481a-88e1-899399cc84dc", "expiration_date": "2019-01-01T00:00:00Z", - "expiration_date": "2019-01-01T00:00:00Z", "approved_at": "2018-01-02T00:00:00Z", "rejected_at": null, "confirmed_at": "2019-01-02T00:00:00Z", diff --git a/OmiseGOTests/FixtureTests/Fixtures/objects/transaction_consumption.json b/OmiseGOTests/FixtureTests/Fixtures/objects/transaction_consumption.json index f4a3352..10cf4e2 100644 --- a/OmiseGOTests/FixtureTests/Fixtures/objects/transaction_consumption.json +++ b/OmiseGOTests/FixtureTests/Fixtures/objects/transaction_consumption.json @@ -12,10 +12,42 @@ }, "correlation_id": "31009545-db10-4287-82f4-afb46d9741d8", "idempotency_token": "31009545-db10-4287-82f4-afb46d9741d8", - "transaction_id": "6ca40f34-6eaa-43e1-b2e1-a94ff3660988", - "user_id": "6f56efa1-caf9-4348-8e0f-f5af283f17ee", - "account_id": null, - "transaction_request_id": "907056a4-fc2d-47cb-af19-5e73aade7ece", + "transaction": { + "object": "transaction", + "id": "6ca40f34-6eaa-43e1-b2e1-a94ff366098", + "from": { + "object": "transaction_source", + "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "amount": 1337, + "minted_token": { + "object": "minted_token", + "id": "BTC:861020af-17b6-49ee-a0cb-661a4d2d1f95", + "symbol": "BTC", + "name": "Bitcoin", + "subunit_to_unit": 100000 + } + }, + "to": { + "object": "transaction_source", + "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "amount": 1337, + "minted_token": { + "object": "minted_token", + "id": "BTC:861020af-17b6-49ee-a0cb-661a4d2d1f95", + "symbol": "BTC", + "name": "Bitcoin", + "subunit_to_unit": 100000 + } + }, + "exchange": { + "object": "exchange", + "rate": 1 + }, + "metadata": {}, + "status": "confirmed", + "created_at": "2018-01-01T00:00:00Z", + "updated_at": "2018-01-01T10:00:00Z" + }, "transaction_request": { "object": "transaction_request", "type": "receive", @@ -42,6 +74,15 @@ "metadata": {} }, "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "user": { + "object": "user", + "id": "6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "provider_user_id": "a_provider_user_id", + "username": "john.doe@example.com", + "socket_topic": "user:6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "metadata": {} + }, + "accountId": null, "socket_topic": "transaction_consumption:8eb0160e-1c96-481a-88e1-899399cc84dc", "expiration_date": "2019-01-01T00:00:00Z", "approved_at": "2018-01-02T00:00:00Z", diff --git a/OmiseGOTests/FixtureTests/Fixtures/objects/transaction_request.json b/OmiseGOTests/FixtureTests/Fixtures/objects/transaction_request.json index ae14804..f3e2cf9 100644 --- a/OmiseGOTests/FixtureTests/Fixtures/objects/transaction_request.json +++ b/OmiseGOTests/FixtureTests/Fixtures/objects/transaction_request.json @@ -11,6 +11,15 @@ }, "amount": 1337, "address": "3b7f1c68-e3bd-4f8f-9916-4af19be95d00", + "user": { + "object": "user", + "id": "6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "provider_user_id": "a_provider_user_id", + "username": "john.doe@example.com", + "socket_topic": "user:6f56efa1-caf9-4348-8e0f-f5af283f17ee", + "metadata": {} + }, + "accountId": null, "correlation_id": "31009545-db10-4287-82f4-afb46d9741d8", "status": "valid", "socket_topic": "transaction_request:8eb0160e-1c96-481a-88e1-899399cc84dc", diff --git a/OmiseGOTests/FixtureTests/TransactionConsumptionFixtureTests.swift b/OmiseGOTests/FixtureTests/TransactionConsumptionFixtureTests.swift index 822babd..e88d75c 100644 --- a/OmiseGOTests/FixtureTests/TransactionConsumptionFixtureTests.swift +++ b/OmiseGOTests/FixtureTests/TransactionConsumptionFixtureTests.swift @@ -45,10 +45,11 @@ class TransactionConsumptionFixtureTests: FixtureTestCase { XCTAssertEqual(mintedToken.subUnitToUnit, 100000) XCTAssertEqual(transactionConsumption.correlationId, "31009545-db10-4287-82f4-afb46d9741d8") XCTAssertEqual(transactionConsumption.idempotencyToken, "31009545-db10-4287-82f4-afb46d9741d8") - XCTAssertEqual(transactionConsumption.transactionId, "6ca40f34-6eaa-43e1-b2e1-a94ff3660988") - XCTAssertEqual(transactionConsumption.userId, "6f56efa1-caf9-4348-8e0f-f5af283f17ee") - XCTAssertNil(transactionConsumption.accountId) - XCTAssertEqual(transactionConsumption.transactionRequestId, "907056a4-fc2d-47cb-af19-5e73aade7ece") + let transaction = transactionConsumption.transaction! + XCTAssertEqual(transaction.id, "6ca40f34-6eaa-43e1-b2e1-a94ff366098") + let user = transactionConsumption.user! + XCTAssertEqual(user.id, "6f56efa1-caf9-4348-8e0f-f5af283f17ee") + XCTAssertNil(transactionConsumption.account) let transactionRequest = transactionConsumption.transactionRequest XCTAssertEqual(transactionRequest.id, "907056a4-fc2d-47cb-af19-5e73aade7ece") XCTAssertEqual(transactionConsumption.address, "3b7f1c68-e3bd-4f8f-9916-4af19be95d00") @@ -87,10 +88,11 @@ class TransactionConsumptionFixtureTests: FixtureTestCase { XCTAssertEqual(mintedToken.subUnitToUnit, 100000) XCTAssertEqual(transactionConsumption.correlationId, "31009545-db10-4287-82f4-afb46d9741d8") XCTAssertEqual(transactionConsumption.idempotencyToken, "31009545-db10-4287-82f4-afb46d9741d8") - XCTAssertEqual(transactionConsumption.transactionId, "6ca40f34-6eaa-43e1-b2e1-a94ff3660988") - XCTAssertEqual(transactionConsumption.userId, "6f56efa1-caf9-4348-8e0f-f5af283f17ee") - XCTAssertNil(transactionConsumption.accountId) - XCTAssertEqual(transactionConsumption.transactionRequestId, "907056a4-fc2d-47cb-af19-5e73aade7ece") + let transaction = transactionConsumption.transaction! + XCTAssertEqual(transaction.id, "6ca40f34-6eaa-43e1-b2e1-a94ff366098") + let user = transactionConsumption.user! + XCTAssertEqual(user.id, "6f56efa1-caf9-4348-8e0f-f5af283f17ee") + XCTAssertNil(transactionConsumption.account) let transactionRequest = transactionConsumption.transactionRequest XCTAssertEqual(transactionRequest.id, "907056a4-fc2d-47cb-af19-5e73aade7ece") XCTAssertEqual(transactionConsumption.address, "3b7f1c68-e3bd-4f8f-9916-4af19be95d00") @@ -129,10 +131,11 @@ class TransactionConsumptionFixtureTests: FixtureTestCase { XCTAssertEqual(mintedToken.subUnitToUnit, 100000) XCTAssertEqual(transactionConsumption.correlationId, "31009545-db10-4287-82f4-afb46d9741d8") XCTAssertEqual(transactionConsumption.idempotencyToken, "31009545-db10-4287-82f4-afb46d9741d8") - XCTAssertEqual(transactionConsumption.transactionId, "6ca40f34-6eaa-43e1-b2e1-a94ff3660988") - XCTAssertEqual(transactionConsumption.userId, "6f56efa1-caf9-4348-8e0f-f5af283f17ee") - XCTAssertNil(transactionConsumption.accountId) - XCTAssertEqual(transactionConsumption.transactionRequestId, "907056a4-fc2d-47cb-af19-5e73aade7ece") + let transaction = transactionConsumption.transaction! + XCTAssertEqual(transaction.id, "6ca40f34-6eaa-43e1-b2e1-a94ff366098") + let user = transactionConsumption.user! + XCTAssertEqual(user.id, "6f56efa1-caf9-4348-8e0f-f5af283f17ee") + XCTAssertNil(transactionConsumption.account) let transactionRequest = transactionConsumption.transactionRequest XCTAssertEqual(transactionRequest.id, "907056a4-fc2d-47cb-af19-5e73aade7ece") XCTAssertEqual(transactionConsumption.address, "3b7f1c68-e3bd-4f8f-9916-4af19be95d00") diff --git a/OmiseGOTests/Helpers/StubGenerator.swift b/OmiseGOTests/Helpers/StubGenerator.swift index 459a87b..911b0c1 100644 --- a/OmiseGOTests/Helpers/StubGenerator.swift +++ b/OmiseGOTests/Helpers/StubGenerator.swift @@ -82,10 +82,9 @@ class StubGenerator { mintedToken: MintedToken? = nil, correlationId: String? = nil, idempotencyToken: String? = nil, - transactionId: String? = nil, - userId: String? = nil, - accountId: String? = nil, - transactionRequestId: String? = nil, + transaction: Transaction? = nil, + user: User? = nil, + account: Account? = nil, transactionRequest: TransactionRequest? = nil, address: String? = nil, socketTopic: String? = nil, @@ -105,12 +104,11 @@ class StubGenerator { mintedToken: mintedToken ?? v.mintedToken, correlationId: correlationId ?? v.correlationId, idempotencyToken: idempotencyToken ?? v.idempotencyToken, - transactionId: transactionId ?? v.transactionId, - userId: userId ?? v.userId, - accountId: accountId ?? v.accountId, - transactionRequestId: transactionRequestId ?? v.transactionRequestId, - transactionRequest: transactionRequest ?? v.transactionRequest, + transaction: transaction ?? v.transaction, address: address ?? v.address, + user: user ?? v.user, + account: account ?? v.account, + transactionRequest: transactionRequest ?? v.transactionRequest, socketTopic: socketTopic ?? v.socketTopic, expirationDate: expirationDate ?? v.expirationDate, approvedAt: approvedAt ?? v.approvedAt, @@ -128,6 +126,8 @@ class StubGenerator { mintedToken: MintedToken? = nil, amount: Double? = nil, address: String? = nil, + user: User? = nil, + account: Account? = nil, correlationId: String? = nil, status: TransactionRequestStatus? = nil, socketTopic: String? = nil, @@ -147,6 +147,8 @@ class StubGenerator { mintedToken: mintedToken ?? v.mintedToken, amount: amount ?? v.amount, address: address ?? v.address, + user: user ?? v.user, + account: account ?? v.account, correlationId: correlationId ?? v.correlationId, status: status ?? v.status, socketTopic: socketTopic ?? v.socketTopic, diff --git a/OmiseGOTests/LiveTests/TransactionRequestLiveTests.swift b/OmiseGOTests/LiveTests/TransactionRequestLiveTests.swift index 4aab755..d2df5c4 100644 --- a/OmiseGOTests/LiveTests/TransactionRequestLiveTests.swift +++ b/OmiseGOTests/LiveTests/TransactionRequestLiveTests.swift @@ -209,7 +209,7 @@ extension TransactionRequestLiveTests { XCTAssertEqual(transactionConsumption.amount, 1) XCTAssertEqual(transactionConsumption.correlationId, consumeCorrelationId) XCTAssertEqual(transactionConsumption.idempotencyToken, idempotencyToken) - XCTAssertEqual(transactionConsumption.transactionRequestId, transactionRequest.id) + XCTAssertEqual(transactionConsumption.transactionRequest.id, transactionRequest.id) XCTAssertEqual(transactionConsumption.status, .pending) } else { XCTFail("Should raise a same address error") diff --git a/OmiseGOTests/ModelTests/TransactionConsumptionParamsTest.swift b/OmiseGOTests/ModelTests/TransactionConsumptionParamsTest.swift index e70d0ab..fb85ec2 100644 --- a/OmiseGOTests/ModelTests/TransactionConsumptionParamsTest.swift +++ b/OmiseGOTests/ModelTests/TransactionConsumptionParamsTest.swift @@ -29,6 +29,8 @@ class TransactionConsumptionParamsTest: XCTestCase { mintedToken: StubGenerator.mintedToken(), amount: nil, address: "3bfe0ff7-f43e-4ac6-bdf9-c4a290c40d0d", + user: StubGenerator.user(), + account: nil, correlationId: "31009545-db10-4287-82f4-afb46d9741d8", status: .valid, socketTopic: "", @@ -55,6 +57,8 @@ class TransactionConsumptionParamsTest: XCTestCase { mintedToken: StubGenerator.mintedToken(), amount: nil, address: "3bfe0ff7-f43e-4ac6-bdf9-c4a290c40d0d", + user: StubGenerator.user(), + account: nil, correlationId: "31009545-db10-4287-82f4-afb46d9741d8", status: .valid, socketTopic: "", diff --git a/Source/Models/Account.swift b/Source/Models/Account.swift new file mode 100644 index 0000000..eb95d79 --- /dev/null +++ b/Source/Models/Account.swift @@ -0,0 +1,60 @@ +// +// Account.swift +// OmiseGO +// +// Created by Mederic Petit on 18/4/18. +// Copyright © 2017-2018 Omise Go Pte. Ltd. All rights reserved. +// + +/// Represents an account +public struct Account { + + /// The unique identifier of the account + public let id: String + /// The id of the parent account + public let parentId: String + /// The name of the account + public let name: String + /// The description of the account + public let description: String + /// A boolean idincating if the account is a master account or not + public let isMaster: Bool + /// The avatar object containing urls + public let avatar: Avatar + /// Any additional metadata that need to be stored as a dictionary + public let metadata: [String: Any] + /// The creation date of the account + public let createdAt: Date + /// The date when the account was last updated + public let updatedAt: Date + +} + +extension Account: Decodable { + + private enum CodingKeys: String, CodingKey { + case id + case parentId = "parent_id" + case name + case description + case isMaster = "master" + case avatar + case metadata + case createdAt = "created_at" + case updatedAt = "updated_at" + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + id = try container.decode(String.self, forKey: .id) + parentId = try container.decode(String.self, forKey: .parentId) + name = try container.decode(String.self, forKey: .name) + description = try container.decode(String.self, forKey: .description) + isMaster = try container.decode(Bool.self, forKey: .isMaster) + avatar = try container.decode(Avatar.self, forKey: .avatar) + metadata = try container.decode([String: Any].self, forKey: .metadata) + createdAt = try container.decode(Date.self, forKey: .createdAt) + updatedAt = try container.decode(Date.self, forKey: .updatedAt) + } + +} diff --git a/Source/Models/Avatar.swift b/Source/Models/Avatar.swift new file mode 100644 index 0000000..e612992 --- /dev/null +++ b/Source/Models/Avatar.swift @@ -0,0 +1,21 @@ +// +// Avatar.swift +// OmiseGO +// +// Created by Mederic Petit on 18/4/18. +// Copyright © 2017-2018 Omise Go Pte. Ltd. All rights reserved. +// + +/// Represents an avatar containing urls of different sizes +public struct Avatar: Decodable { + + /// The url of the original image + public let original: String + /// The url of the large image + public let large: String + /// The url of the small image + public let small: String + /// The url of the thumbnail image + public let thumb: String + +} diff --git a/Source/Models/TransactionConsumption.swift b/Source/Models/TransactionConsumption.swift index 8cdadb1..66b8655 100644 --- a/Source/Models/TransactionConsumption.swift +++ b/Source/Models/TransactionConsumption.swift @@ -38,20 +38,17 @@ public struct TransactionConsumption { /// The idempotency token of the consumption public let idempotencyToken: String /// The transaction generated by this consumption (this will be nil until the consumption is confirmed) - public let transactionId: String? - /// The id of the user that initiated the consumption - public let userId: String? - /// The id of the account that initiated the consumption - public let accountId: String? - /// The id of the transaction request to be consumed - public let transactionRequestId: String - /// The transaction request to be consumed - public let transactionRequest: TransactionRequest + public let transaction: Transaction? /// The address used for the consumption public let address: String + /// The user that initiated the consumption + public let user: User? + /// The account that initiated the consumption + public let account: Account? + /// The transaction request to be consumed + public let transactionRequest: TransactionRequest /// The topic which can be listened in order to receive events regarding this consumption public let socketTopic: String - /// The date when the consumption will expire public let expirationDate: Date? /// The date when the consumption got approved @@ -82,11 +79,10 @@ extension TransactionConsumption: Decodable { case mintedToken = "minted_token" case correlationId = "correlation_id" case idempotencyToken = "idempotency_token" - case transactionId = "transaction_id" - case userId = "user_id" - case accountId = "account_id" - case transactionRequestId = "transaction_request_id" + case user + case account case transactionRequest = "transaction_request" + case transaction case address case socketTopic = "socket_topic" case expirationDate = "expiration_date" @@ -107,10 +103,9 @@ extension TransactionConsumption: Decodable { mintedToken = try container.decode(MintedToken.self, forKey: .mintedToken) correlationId = try container.decodeIfPresent(String.self, forKey: .correlationId) idempotencyToken = try container.decode(String.self, forKey: .idempotencyToken) - transactionId = try container.decodeIfPresent(String.self, forKey: .transactionId) - userId = try container.decodeIfPresent(String.self, forKey: .userId) - accountId = try container.decodeIfPresent(String.self, forKey: .accountId) - transactionRequestId = try container.decode(String.self, forKey: .transactionRequestId) + transaction = try container.decodeIfPresent(Transaction.self, forKey: .transaction) + user = try container.decodeIfPresent(User.self, forKey: .user) + account = try container.decodeIfPresent(Account.self, forKey: .account) transactionRequest = try container.decode(TransactionRequest.self, forKey: .transactionRequest) address = try container.decode(String.self, forKey: .address) socketTopic = try container.decode(String.self, forKey: .socketTopic) diff --git a/Source/Models/TransactionRequest.swift b/Source/Models/TransactionRequest.swift index f97998e..754b5f7 100644 --- a/Source/Models/TransactionRequest.swift +++ b/Source/Models/TransactionRequest.swift @@ -40,6 +40,10 @@ public struct TransactionRequest { public let amount: Double? /// The address from which to send or receive the minted tokens public let address: String + /// The user that initiated the request + public let user: User? + /// The account that initiated the request + public let account: Account? /// An id that can uniquely identify a transaction. Typically an order id from a provider. public let correlationId: String? /// The status of the request (valid or expired) @@ -75,6 +79,8 @@ extension TransactionRequest: Decodable { case mintedToken = "minted_token" case amount case address + case user + case account case correlationId = "correlation_id" case status case socketTopic = "socket_topic" @@ -95,6 +101,8 @@ extension TransactionRequest: Decodable { mintedToken = try container.decode(MintedToken.self, forKey: .mintedToken) amount = try container.decodeIfPresent(Double.self, forKey: .amount) address = try container.decode(String.self, forKey: .address) + user = try container.decodeIfPresent(User.self, forKey: .user) + account = try container.decodeIfPresent(Account.self, forKey: .account) correlationId = try container.decodeIfPresent(String.self, forKey: .correlationId) status = try container.decode(TransactionRequestStatus.self, forKey: .status) socketTopic = try container.decode(String.self, forKey: .socketTopic) diff --git a/Source/Models/User.swift b/Source/Models/User.swift index 3cbb5dd..df13c6f 100644 --- a/Source/Models/User.swift +++ b/Source/Models/User.swift @@ -9,7 +9,7 @@ /// Represents the current user public struct User: Listenable { - /// The uniq identifier on the wallet server side + /// The unique identifier on the wallet server side public let id: String /// The user identifier on the provider server side public let providerUserId: String