@bsv/wallet-toolbox
Version:
BRC100 conforming wallet, wallet storage and wallet signer components
199 lines (167 loc) • 6.45 kB
text/typescript
import { EntityTxLabel } from '../EntityTxLabel'
import { createSyncMap, sdk, SyncMap, TableTxLabel } from '../../../../../src'
import { TestUtilsWalletStorage as _tu, TestWalletNoSetup } from '../../../../../test/utils/TestUtilsWalletStorage'
describe('TxLabel Class Tests', () => {
jest.setTimeout(99999999) // Extend timeout for database operations
const env = _tu.getEnv('test') // Test environment
const ctxs: TestWalletNoSetup[] = [] // Context for primary databases
const ctxs2: TestWalletNoSetup[] = [] // Context for secondary databases
beforeAll(async () => {
// Set up MySQL and SQLite databases for testing
if (env.runMySQL) {
ctxs.push(await _tu.createLegacyWalletMySQLCopy('txLabelTests_db1'))
ctxs2.push(await _tu.createLegacyWalletMySQLCopy('txLabelTests_db2'))
}
ctxs.push(await _tu.createLegacyWalletSQLiteCopy('txLabelTests_db1'))
ctxs2.push(await _tu.createLegacyWalletSQLiteCopy('txLabelTests_db2'))
})
afterAll(async () => {
// Clean up primary databases
for (const ctx of ctxs) {
await ctx.storage.destroy()
}
// Clean up secondary databases
for (const ctx of ctxs2) {
await ctx.storage.destroy()
}
})
// Test: Default constructor behavior
test('1_creates_txLabel_with_default_values', () => {
const txLabel = new EntityTxLabel()
// Default values
expect(txLabel.txLabelId).toBe(0)
expect(txLabel.label).toBe('')
expect(txLabel.userId).toBe(0)
expect(txLabel.isDeleted).toBe(false)
expect(txLabel.created_at).toBeInstanceOf(Date)
expect(txLabel.updated_at).toBeInstanceOf(Date)
expect(txLabel.created_at <= txLabel.updated_at).toBe(true)
})
// Test: Constructor with provided API object
test('2_creates_txLabel_with_provided_api_object', () => {
const now = new Date()
const apiObject: TableTxLabel = {
txLabelId: 42,
label: 'Test Label',
userId: 101,
isDeleted: false,
created_at: now,
updated_at: now
}
const txLabel = new EntityTxLabel(apiObject)
// Verify all properties match the API object
expect(txLabel.txLabelId).toBe(42)
expect(txLabel.label).toBe('Test Label')
expect(txLabel.userId).toBe(101)
expect(txLabel.isDeleted).toBe(false)
expect(txLabel.created_at).toBe(now)
expect(txLabel.updated_at).toBe(now)
})
// Test: Getters and setters behavior
test('3_getters_and_setters_work_correctly', () => {
const txLabel = new EntityTxLabel()
const now = new Date()
txLabel.txLabelId = 1
txLabel.label = 'New Label'
txLabel.userId = 200
txLabel.isDeleted = true
txLabel.created_at = now
txLabel.updated_at = now
txLabel.id = 2
expect(txLabel.id).toBe(2)
expect(txLabel.entityName).toBe('txLabel')
expect(txLabel.entityTable).toBe('tx_labels')
expect(txLabel.txLabelId).toBe(2)
expect(txLabel.label).toBe('New Label')
expect(txLabel.userId).toBe(200)
expect(txLabel.isDeleted).toBe(true)
expect(txLabel.created_at).toBe(now)
expect(txLabel.updated_at).toBe(now)
})
// Test: mergeExisting does not update TxLabel when `ei.updated_at` is older
test('5_mergeExisting_does_not_update_txLabel_when_ei_updated_at_is_older', async () => {
for (const { activeStorage } of ctxs) {
const txLabel = new EntityTxLabel({
txLabelId: 302,
label: 'Original Label',
userId: 1,
isDeleted: false,
created_at: new Date('2023-01-01'),
updated_at: new Date('2023-02-01')
})
await activeStorage.insertTxLabel(txLabel.toApi())
const olderEi: TableTxLabel = {
txLabelId: 302,
label: 'Outdated Label',
userId: 1,
isDeleted: true,
created_at: new Date('2023-01-01'),
updated_at: new Date('2023-01-01')
}
const result = await txLabel.mergeExisting(activeStorage, undefined, olderEi, {} as any)
const reloadedTxLabel = await activeStorage.findTxLabelById(txLabel.id)
expect(result).toBe(false)
expect(reloadedTxLabel?.label).toBe('Original Label')
expect(reloadedTxLabel?.isDeleted).toBe(false)
expect(reloadedTxLabel?.updated_at).toEqual(new Date('2023-02-01'))
}
})
test('6_equals_identifies_matching_entities', async () => {
const ctx1 = ctxs[0]
const ctx2 = ctxs2[0]
// Insert a TxLabel into the first database
const txLabel1 = new EntityTxLabel({
txLabelId: 303,
userId: 1,
label: 'Test Label',
isDeleted: false,
created_at: new Date('2023-01-01'),
updated_at: new Date('2023-01-02')
})
await ctx1.activeStorage.insertTxLabel(txLabel1.toApi())
// Insert a matching TxLabel into the second database
const txLabel2 = new EntityTxLabel({
txLabelId: 304,
userId: 1, // Different userId to simulate syncMap usage
label: 'Test Label',
isDeleted: false,
created_at: new Date('2023-01-01'),
updated_at: new Date('2023-01-02')
})
await ctx2.activeStorage.insertTxLabel(txLabel2.toApi())
const syncMap = createSyncMap()
syncMap.txLabel.idMap = { [txLabel2.userId]: txLabel1.userId }
syncMap.txLabel.count = 1
// Verify the entities match
expect(txLabel1.equals(txLabel2.toApi(), syncMap)).toBe(true)
})
test('7_equals_identifies_non_matching_entities', async () => {
const ctx1 = ctxs[0]
const ctx2 = ctxs2[0]
// Insert a TxLabel into the first database
const txLabel1 = new EntityTxLabel({
txLabelId: 305,
userId: 1,
label: 'Label A',
isDeleted: false,
created_at: new Date('2023-01-01'),
updated_at: new Date('2023-01-02')
})
await ctx1.activeStorage.insertTxLabel(txLabel1.toApi())
// Insert a non-matching TxLabel into the second database
const txLabel2 = new EntityTxLabel({
txLabelId: 306, // Different txLabelId
userId: 1, // Different userId
label: 'Label B', // Different label
isDeleted: true, // Different isDeleted value
created_at: new Date('2023-01-01'),
updated_at: new Date('2023-01-02')
})
await ctx2.activeStorage.insertTxLabel(txLabel2.toApi())
const syncMap = createSyncMap()
syncMap.txLabel.idMap = { [txLabel2.userId]: txLabel1.userId }
syncMap.txLabel.count = 1
// Verify the entities do not match
expect(txLabel1.equals(txLabel2.toApi(), syncMap)).toBe(false)
})
})