@bsv/wallet-toolbox
Version:
BRC100 conforming wallet, wallet storage and wallet signer components
228 lines • 10.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const src_1 = require("../../../../../src");
const TestUtilsWalletStorage_1 = require("../../../../../test/utils/TestUtilsWalletStorage");
const EntityOutputBasket_1 = require("../EntityOutputBasket");
describe('OutputBasket class method tests', () => {
jest.setTimeout(99999999);
const env = TestUtilsWalletStorage_1.TestUtilsWalletStorage.getEnv('test');
const ctxs = [];
const ctxs2 = [];
beforeAll(async () => {
if (env.runMySQL) {
ctxs.push(await TestUtilsWalletStorage_1.TestUtilsWalletStorage.createLegacyWalletMySQLCopy('OutputBasketTests'));
ctxs2.push(await TestUtilsWalletStorage_1.TestUtilsWalletStorage.createLegacyWalletMySQLCopy('OutputBasketTests2'));
}
ctxs.push(await TestUtilsWalletStorage_1.TestUtilsWalletStorage.createLegacyWalletSQLiteCopy('OutputBasketTests'));
ctxs2.push(await TestUtilsWalletStorage_1.TestUtilsWalletStorage.createLegacyWalletSQLiteCopy('OutputBasketTests2'));
});
afterAll(async () => {
for (const ctx of ctxs) {
await ctx.storage.destroy();
}
for (const ctx of ctxs2) {
await ctx.storage.destroy();
}
});
test('1_mergeExisting merges and updates entity when ei.updated_at > this.updated_at', async () => {
const ctx = ctxs[0];
// Insert initial OutputBasket record with valid data
const initialData = {
basketId: 100,
created_at: new Date('2023-01-01'),
updated_at: new Date('2023-01-02'),
userId: 1,
name: 'Basket1',
numberOfDesiredUTXOs: 10,
minimumDesiredUTXOValue: 5000,
isDeleted: false
};
await ctx.activeStorage.insertOutputBasket(initialData);
// Create an OutputBasket entity from the initial data
const entity = new EntityOutputBasket_1.EntityOutputBasket(initialData);
// Simulate the `ei` argument with a later `updated_at`
const updatedData = {
...initialData,
updated_at: new Date('2023-01-03'), // Later timestamp
numberOfDesiredUTXOs: 20, // Update this field
minimumDesiredUTXOValue: 10000, // Update this field
isDeleted: true // Simulate a change in `isDeleted`
};
const syncMap = (0, src_1.createSyncMap)();
syncMap.outputBasket.idMap[100] = 100;
// Call mergeExisting
const wasMergedRaw = await entity.mergeExisting(ctx.activeStorage, undefined, // `since` is not used in this method
updatedData, syncMap, undefined // `trx` is not used
);
const wasMerged = Boolean(wasMergedRaw);
// Verify that wasMerged is true
expect(wasMerged).toBe(true);
// Verify that the entity is updated
expect(entity.numberOfDesiredUTXOs).toBe(20);
expect(entity.minimumDesiredUTXOValue).toBe(10000);
expect(entity.isDeleted).toBe(1);
// Verify that the database is updated
const updatedRecord = await ctx.activeStorage.findOutputBaskets({
partial: { basketId: 100 }
});
expect(updatedRecord.length).toBe(1);
expect(updatedRecord[0]).toBeDefined(); // Ensure record exists
expect(updatedRecord[0].numberOfDesiredUTXOs).toBe(20);
expect(updatedRecord[0].minimumDesiredUTXOValue).toBe(10000);
expect(updatedRecord[0].isDeleted).toBe(true);
});
test('2_mergeExisting does not merge when ei.updated_at <= this.updated_at', async () => {
const ctx = ctxs[0];
// Insert initial OutputBasket record with valid data
const initialData = {
basketId: 200,
created_at: new Date('2023-01-01'),
updated_at: new Date('2023-01-02'),
userId: 1,
name: 'Basket2',
numberOfDesiredUTXOs: 10,
minimumDesiredUTXOValue: 5000,
isDeleted: false
};
await ctx.activeStorage.insertOutputBasket(initialData);
// Create an OutputBasket entity from the initial data
const entity = new EntityOutputBasket_1.EntityOutputBasket(initialData);
// Simulate the `ei` argument with an earlier `updated_at`
const earlierData = {
...initialData,
updated_at: new Date('2023-01-01'), // Earlier timestamp
numberOfDesiredUTXOs: 20, // Simulate a change
minimumDesiredUTXOValue: 10000, // Simulate a change
isDeleted: true // Simulate a change
};
const syncMap = (0, src_1.createSyncMap)();
syncMap.outputBasket.idMap[200] = 200;
// Call mergeExisting
const wasMergedRaw = await entity.mergeExisting(ctx.activeStorage, undefined, // `since` is not used in this method
earlierData, syncMap, undefined // `trx` is not used
);
const wasMerged = Boolean(wasMergedRaw);
// Verify that wasMerged is false
expect(wasMerged).toBe(false);
// Verify that the entity is not updated
expect(entity.numberOfDesiredUTXOs).toBe(10);
expect(entity.minimumDesiredUTXOValue).toBe(5000);
expect(entity.isDeleted).toBe(0);
// Verify that the database is not updated
const updatedRecord = await ctx.activeStorage.findOutputBaskets({
partial: { basketId: 200 }
});
expect(updatedRecord.length).toBe(1);
expect(updatedRecord[0]).toBeDefined(); // Ensure record exists
expect(updatedRecord[0].numberOfDesiredUTXOs).toBe(10);
expect(updatedRecord[0].minimumDesiredUTXOValue).toBe(5000);
expect(updatedRecord[0].isDeleted).toBe(false);
});
test('equals identifies matching entities with and without SyncMap', async () => {
const ctx = ctxs[0];
// Insert two identical OutputBasket records in the database
const basketData = {
basketId: 401,
created_at: new Date('2023-01-01'),
updated_at: new Date('2023-01-02'),
userId: 1,
name: 'Test Basket',
numberOfDesiredUTXOs: 10,
minimumDesiredUTXOValue: 1000,
isDeleted: false
};
await ctx.activeStorage.insertOutputBasket(basketData);
// Create two identical entities
const entity1 = new EntityOutputBasket_1.EntityOutputBasket(basketData);
const entity2 = new EntityOutputBasket_1.EntityOutputBasket(basketData);
// Test: equals returns true for identical entities without SyncMap
expect(entity1.equals(entity2.toApi())).toBe(true);
const syncMap = (0, src_1.createSyncMap)();
syncMap.outputBasket.idMap[401] = 401;
// Test: equals returns true for identical entities with SyncMap
expect(entity1.equals(entity2.toApi(), syncMap)).toBe(true);
});
test('equals identifies non-matching entities', async () => {
const ctx = ctxs[0];
// Insert two different OutputBasket records in the database
const basketData1 = {
basketId: 402,
created_at: new Date('2023-01-01'),
updated_at: new Date('2023-01-02'),
userId: 1,
name: 'Test Basket 1',
numberOfDesiredUTXOs: 10,
minimumDesiredUTXOValue: 1000,
isDeleted: false
};
const basketData2 = {
basketId: 403,
created_at: new Date('2023-01-01'),
updated_at: new Date('2023-01-02'),
userId: 1,
name: 'Test Basket 2',
numberOfDesiredUTXOs: 5,
minimumDesiredUTXOValue: 500,
isDeleted: true
};
await ctx.activeStorage.insertOutputBasket(basketData1);
await ctx.activeStorage.insertOutputBasket(basketData2);
// Create entities
const entity1 = new EntityOutputBasket_1.EntityOutputBasket(basketData1);
const entity2 = new EntityOutputBasket_1.EntityOutputBasket(basketData2);
// Test: equals returns false for different entities without SyncMap
expect(entity1.equals(entity2.toApi())).toBe(false);
const syncMap = (0, src_1.createSyncMap)();
syncMap.outputBasket.idMap[1] = 2;
// Test: equals returns false for different entities with SyncMap
expect(entity1.equals(entity2.toApi(), syncMap)).toBe(false);
});
test('OutputBasket getters, setters, and updateApi', () => {
// Create a mock OutputBasket instance
const initialData = {
basketId: 123,
created_at: new Date('2023-01-01'),
updated_at: new Date('2023-01-02'),
userId: 1,
name: 'Test Basket',
numberOfDesiredUTXOs: 10,
minimumDesiredUTXOValue: 1000,
isDeleted: false
};
const entity = new EntityOutputBasket_1.EntityOutputBasket(initialData);
// Test getters
expect(entity.basketId).toBe(123);
expect(entity.created_at.getTime()).toBe(new Date('2023-01-01').getTime());
expect(entity.updated_at.getTime()).toBe(new Date('2023-01-02').getTime());
expect(entity.userId).toBe(1);
expect(entity.name).toBe('Test Basket');
expect(entity.numberOfDesiredUTXOs).toBe(10);
expect(entity.minimumDesiredUTXOValue).toBe(1000);
expect(entity.isDeleted).toBe(false);
expect(entity.id).toBe(123);
expect(entity.entityName).toBe('outputBasket');
expect(entity.entityTable).toBe('output_baskets');
// Test setters
entity.basketId = 456;
entity.created_at = new Date('2023-02-01');
entity.updated_at = new Date('2023-02-02');
entity.userId = 2;
entity.name = 'Updated Basket';
entity.numberOfDesiredUTXOs = 20;
entity.minimumDesiredUTXOValue = 2000;
entity.isDeleted = true;
entity.id = 456;
expect(entity.basketId).toBe(456);
expect(entity.created_at.getTime()).toBe(new Date('2023-02-01').getTime());
expect(entity.updated_at.getTime()).toBe(new Date('2023-02-02').getTime());
expect(entity.userId).toBe(2);
expect(entity.name).toBe('Updated Basket');
expect(entity.numberOfDesiredUTXOs).toBe(20);
expect(entity.minimumDesiredUTXOValue).toBe(2000);
expect(entity.isDeleted).toBe(true);
expect(entity.id).toBe(456);
// Test updateApi (even though it does nothing)
expect(() => entity.updateApi()).not.toThrow();
});
});
//# sourceMappingURL=OutputBasketTests.test.js.map