transfers.test.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. const { eq, ok } = require('../../helpers/assert');
  2. const { makeNetwork, makePeer } = require('../../helpers/setup');
  3. describe('transfers: create + list + confirm', (t) => {
  4. t('A creates transfer to B', async () => {
  5. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  6. A.setActor();
  7. const r = await A.use('transfers').createTransfer(B.keypair.id, 'rent', '10', '2026-12-31', []);
  8. ok(r);
  9. const list = await A.use('transfers').listAll('all');
  10. ok(list.length >= 1);
  11. const mine = list.find(x => x.concept === 'rent');
  12. ok(mine);
  13. ok(mine.amount.startsWith('10'));
  14. eq(mine.to, B.keypair.id);
  15. });
  16. t('B (recipient) confirms transfer', async () => {
  17. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  18. A.setActor();
  19. const r = await A.use('transfers').createTransfer(B.keypair.id, 'fee', '5', '2026-12-31', []);
  20. B.setActor();
  21. await B.use('transfers').confirmTransferById(r.key);
  22. const list = await B.use('transfers').listAll('all');
  23. const t = list.find(x => x.concept === 'fee');
  24. ok(t);
  25. ok(t.confirmedBy.includes(B.keypair.id));
  26. });
  27. t('A casts opinion on transfer', async () => {
  28. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  29. A.setActor();
  30. const r = await A.use('transfers').createTransfer(B.keypair.id, 'gift', '1', '2026-12-31', []);
  31. await A.use('transfers').createOpinion(r.key, 'inspiring');
  32. });
  33. });
  34. describe('transfers: ECONOMIC / TIME / TRUST categories', (t) => {
  35. t('default category is ECONOMIC when omitted', async () => {
  36. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  37. A.setActor();
  38. await A.use('transfers').createTransfer(B.keypair.id, 'rent', '10', '2026-12-31', []);
  39. const list = await A.use('transfers').listAll('all');
  40. const tr = list.find(x => x.concept === 'rent');
  41. eq(tr.category, 'ECONOMIC');
  42. });
  43. t('TIME category persists and round-trips', async () => {
  44. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  45. A.setActor();
  46. await A.use('transfers').createTransfer(B.keypair.id, 'fix-router', '2', '2026-12-31', ['help'], 'TIME');
  47. const list = await A.use('transfers').listAll('all');
  48. const tr = list.find(x => x.concept === 'fix-router');
  49. eq(tr.category, 'TIME');
  50. ok(tr.amount.startsWith('2'));
  51. });
  52. t('TRUST category persists and round-trips', async () => {
  53. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  54. A.setActor();
  55. await A.use('transfers').createTransfer(B.keypair.id, 'vouch', '1', '2026-12-31', [], 'TRUST');
  56. const list = await A.use('transfers').listAll('all');
  57. const tr = list.find(x => x.concept === 'vouch');
  58. eq(tr.category, 'TRUST');
  59. });
  60. t('invalid category falls back to ECONOMIC', async () => {
  61. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  62. A.setActor();
  63. await A.use('transfers').createTransfer(B.keypair.id, 'garbage-cat', '3', '2026-12-31', [], 'NONSENSE');
  64. const list = await A.use('transfers').listAll('all');
  65. const tr = list.find(x => x.concept === 'garbage-cat');
  66. eq(tr.category, 'ECONOMIC');
  67. });
  68. t('lowercase category is normalized', async () => {
  69. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  70. A.setActor();
  71. await A.use('transfers').createTransfer(B.keypair.id, 'lc', '4', '2026-12-31', [], 'time');
  72. const list = await A.use('transfers').listAll('all');
  73. const tr = list.find(x => x.concept === 'lc');
  74. eq(tr.category, 'TIME');
  75. });
  76. t('update preserves category when not specified', async () => {
  77. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  78. A.setActor();
  79. const r = await A.use('transfers').createTransfer(B.keypair.id, 'orig', '5', '2026-12-31', [], 'TRUST');
  80. await A.use('transfers').updateTransferById(r.key, B.keypair.id, 'orig-v2', '6', '2026-12-31', []);
  81. const list = await A.use('transfers').listAll('all');
  82. const tr = list.find(x => x.concept === 'orig-v2');
  83. eq(tr.category, 'TRUST');
  84. });
  85. t('update can change category', async () => {
  86. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  87. A.setActor();
  88. const r = await A.use('transfers').createTransfer(B.keypair.id, 'swap', '5', '2026-12-31', [], 'ECONOMIC');
  89. await A.use('transfers').updateTransferById(r.key, B.keypair.id, 'swap-v2', '6', '2026-12-31', [], 'TIME');
  90. const list = await A.use('transfers').listAll('all');
  91. const tr = list.find(x => x.concept === 'swap-v2');
  92. eq(tr.category, 'TIME');
  93. });
  94. t('confirm preserves category', async () => {
  95. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  96. A.setActor();
  97. const r = await A.use('transfers').createTransfer(B.keypair.id, 'keepcat', '5', '2026-12-31', [], 'TIME');
  98. B.setActor();
  99. await B.use('transfers').confirmTransferById(r.key);
  100. const list = await B.use('transfers').listAll('all');
  101. const tr = list.find(x => x.concept === 'keepcat');
  102. eq(tr.category, 'TIME');
  103. ok(tr.confirmedBy.includes(B.keypair.id));
  104. });
  105. });