From 2fb25dcd35e0a858ea2722001baf707cd0f211f4 Mon Sep 17 00:00:00 2001 From: Francisco Gindre Date: Fri, 21 Oct 2022 18:19:08 -0300 Subject: [PATCH] Fix: Transaction repository tests pass --- .../DAO/PendingTransactionDao.swift | 6 ++-- .../DAO/TransactionDao.swift | 35 +++++++++++++++++-- .../TransactionRepositoryTests.swift | 23 ++++++------ 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/Sources/ZcashLightClientKit/DAO/PendingTransactionDao.swift b/Sources/ZcashLightClientKit/DAO/PendingTransactionDao.swift index 9b92fa4d..ccc42c8c 100644 --- a/Sources/ZcashLightClientKit/DAO/PendingTransactionDao.swift +++ b/Sources/ZcashLightClientKit/DAO/PendingTransactionDao.swift @@ -137,7 +137,9 @@ struct PendingTransaction: PendingTransactionEntity, Decodable, Encodable { self.value = Zatoshi(zatoshiValue) self.memo = try container.decodeIfPresent(Data.self, forKey: .memo) self.rawTransactionId = try container.decodeIfPresent(Data.self, forKey: .rawTransactionId) - self.fee = try container.decodeIfPresent(Zatoshi.self, forKey: .fee) + if let feeValue = try container.decodeIfPresent(Int64.self, forKey: .fee) { + self.fee = Zatoshi(feeValue) + } } func encode(to encoder: Encoder) throws { @@ -168,7 +170,7 @@ struct PendingTransaction: PendingTransactionEntity, Decodable, Encodable { try container.encode(self.value.amount, forKey: .value) try container.encodeIfPresent(self.memo, forKey: .memo) try container.encodeIfPresent(self.rawTransactionId, forKey: .rawTransactionId) - try container.encodeIfPresent(self.fee, forKey: .fee) + try container.encodeIfPresent(self.fee?.amount, forKey: .fee) } func isSameTransactionId(other: T) -> Bool where T: RawIdentifiable { diff --git a/Sources/ZcashLightClientKit/DAO/TransactionDao.swift b/Sources/ZcashLightClientKit/DAO/TransactionDao.swift index b6d40a9d..c4295ac9 100644 --- a/Sources/ZcashLightClientKit/DAO/TransactionDao.swift +++ b/Sources/ZcashLightClientKit/DAO/TransactionDao.swift @@ -8,7 +8,7 @@ import Foundation import SQLite -struct Transaction: TransactionEntity, Decodable { +struct Transaction: TransactionEntity { enum CodingKeys: String, CodingKey { case id = "id_tx" case transactionId = "txid" @@ -30,6 +30,35 @@ struct Transaction: TransactionEntity, Decodable { var fee: Zatoshi? } +extension Transaction: Codable { + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.id = try container.decodeIfPresent(Int.self, forKey: .id) + self.transactionId = try container.decode(Data.self, forKey: .transactionId) + self.created = try container.decodeIfPresent(String.self, forKey: .created) + self.transactionIndex = try container.decodeIfPresent(Int.self, forKey: .transactionIndex) + self.expiryHeight = try container.decodeIfPresent(BlockHeight.self, forKey: .expiryHeight) + self.minedHeight = try container.decodeIfPresent(BlockHeight.self, forKey: .minedHeight) + self.raw = try container.decodeIfPresent(Data.self, forKey: .raw) + + if let fee = try container.decodeIfPresent(Int64.self, forKey: .fee) { + self.fee = Zatoshi(fee) + } + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encodeIfPresent(self.id, forKey: .id) + try container.encode(self.transactionId, forKey: .transactionId) + try container.encodeIfPresent(self.created, forKey: .created) + try container.encodeIfPresent(self.transactionIndex, forKey: .transactionIndex) + try container.encodeIfPresent(self.expiryHeight, forKey: .expiryHeight) + try container.encodeIfPresent(self.minedHeight, forKey: .minedHeight) + try container.encodeIfPresent(self.raw, forKey: .raw) + try container.encodeIfPresent(self.fee?.amount, forKey: .fee) + } +} + struct ConfirmedTransaction: ConfirmedTransactionEntity { var toAddress: String? var expiryHeight: BlockHeight? @@ -261,8 +290,8 @@ extension TransactionSQLDAO { LEFT JOIN blocks ON transactions.block = blocks.height WHERE (\(fromTransaction.blockTimeInSeconds), \(fromTransaction.transactionIndex)) > (blocktimeinseconds, transactionIndex) AND - (sent_notes.to_address IS NULL AND received_notes.is_change != 1) - OR sent_notes.to_address IS NOT NULL + ((sent_notes.to_address IS NULL AND received_notes.is_change != 1) + OR sent_notes.to_address IS NOT NULL) ORDER BY ( minedheight IS NOT NULL ), minedheight DESC, blocktimeinseconds DESC, diff --git a/Tests/OfflineTests/TransactionRepositoryTests.swift b/Tests/OfflineTests/TransactionRepositoryTests.swift index 28025e6b..964cf043 100644 --- a/Tests/OfflineTests/TransactionRepositoryTests.swift +++ b/Tests/OfflineTests/TransactionRepositoryTests.swift @@ -15,6 +15,7 @@ class TransactionRepositoryTests: XCTestCase { override func setUp() { super.setUp() + transactionRepository = try! TestDbBuilder.transactionRepository() } @@ -46,14 +47,14 @@ class TransactionRepositoryTests: XCTestCase { } XCTAssertEqual(transaction.id, 10) - XCTAssertEqual(transaction.minedHeight, 652812) + XCTAssertEqual(transaction.minedHeight, 663942) XCTAssertEqual(transaction.transactionIndex, 5) } func testFindByTxId() { var transaction: TransactionEntity? - - let id = Data(fromHexEncodedString: "0BAFC5B83F5B39A5270144ECD98DBC65115055927EDDA8FF20F081FFF13E4780")! + + let id = Data(fromHexEncodedString: "01af48bcc4e9667849a073b8b5c539a0fc19de71aac775377929dc6567a36eff")! XCTAssertNoThrow( try { transaction = try self.transactionRepository.findBy(rawId: id) }() @@ -64,9 +65,9 @@ class TransactionRepositoryTests: XCTestCase { return } - XCTAssertEqual(transaction.id, 10) - XCTAssertEqual(transaction.minedHeight, 652812) - XCTAssertEqual(transaction.transactionIndex, 5) + XCTAssertEqual(transaction.id, 8) + XCTAssertEqual(transaction.minedHeight, 663922) + XCTAssertEqual(transaction.transactionIndex, 1) } func testFindAllSentTransactions() { @@ -77,7 +78,7 @@ class TransactionRepositoryTests: XCTestCase { return } - XCTAssertEqual(txs.count, 0) + XCTAssertEqual(txs.count, 13) } func testFindAllReceivedTransactions() { @@ -88,7 +89,7 @@ class TransactionRepositoryTests: XCTestCase { return } - XCTAssertEqual(txs.count, 27) + XCTAssertEqual(txs.count, 7) } func testFindAllTransactions() { @@ -99,7 +100,7 @@ class TransactionRepositoryTests: XCTestCase { return } - XCTAssertEqual(txs.count, 27) + XCTAssertEqual(txs.count, 20) } func testFindAllPerformance() { @@ -134,8 +135,8 @@ class TransactionRepositoryTests: XCTestCase { } func testFindAllFromSlice() throws { - let limit = 1 - let start = 0 + let limit = 4 + let start = 7 guard let transactions = try self.transactionRepository.findAll(offset: 0, limit: Int.max), let allFromNil = try self.transactionRepository.findAll(from: transactions[start], limit: limit)