content.test.js 5.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. const { eq, ok, notOk, throwsAsync } = require('../../helpers/assert');
  2. const { makeNetwork, makePeer } = require('../../helpers/setup');
  3. describe('sub-tribes: content publishing', (t) => {
  4. t('A publishes a feed inside a sub-tribe', async () => {
  5. const net = makeNetwork(); const A = makePeer(net); A.setActor();
  6. const p = await A.use('tribes').createTribe('P', '', null, '', [], false, true, 'strict', null, 'OPEN', '');
  7. const s = await A.use('tribes').createTribe('S', '', null, '', [], false, true, 'strict', p.key, 'OPEN', '');
  8. await A.use('tribesContent').create(s.key, 'feed', { description: 'feed in sub' });
  9. const items = await A.use('tribesContent').listByTribe(s.key, 'feed');
  10. eq(items.length, 1);
  11. eq(items[0].description, 'feed in sub');
  12. });
  13. t('content in sub-tribe is NOT visible to parent-only members', async () => {
  14. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  15. A.setActor();
  16. const p = await A.use('tribes').createTribe('P', '', null, '', [], false, true, 'strict', null, 'OPEN', '');
  17. const s = await A.use('tribes').createTribe('S', '', null, '', [], false, true, 'strict', p.key, 'OPEN', '');
  18. const code = await A.use('tribes').generateInvite(p.key);
  19. B.setActor();
  20. await B.use('tribes').joinByInvite(code);
  21. A.setActor();
  22. await A.use('tribesContent').create(s.key, 'feed', { description: 'sub only' });
  23. B.setActor();
  24. const items = await B.use('tribesContent').listByTribe(s.key, 'feed');
  25. eq(items.length, 0, 'B (parent member, not sub member) cannot read sub content');
  26. });
  27. t('content in parent-tribe is NOT visible to sub-tribe-only members', async () => {
  28. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  29. A.setActor();
  30. const p = await A.use('tribes').createTribe('P', '', null, '', [], false, true, 'strict', null, 'OPEN', '');
  31. const s = await A.use('tribes').createTribe('S', '', null, '', [], false, true, 'strict', p.key, 'OPEN', '');
  32. const code = await A.use('tribes').generateInvite(s.key);
  33. B.setActor();
  34. await B.use('tribes').joinByInvite(code);
  35. A.setActor();
  36. await A.use('tribesContent').create(p.key, 'feed', { description: 'parent only' });
  37. B.setActor();
  38. const items = await B.use('tribesContent').listByTribe(p.key, 'feed');
  39. eq(items.length, 0, 'B (sub member only) cannot read parent content');
  40. });
  41. t('event in sub-tribe with attendees', async () => {
  42. const net = makeNetwork(); const A = makePeer(net); A.setActor();
  43. const p = await A.use('tribes').createTribe('P', '', null, '', [], false, true, 'strict', null, 'OPEN', '');
  44. const s = await A.use('tribes').createTribe('S', '', null, '', [], false, true, 'strict', p.key, 'OPEN', '');
  45. const ev = await A.use('tribesContent').create(s.key, 'event', { title: 'sub party', description: 'd', date: '2030-12-01' });
  46. await A.use('tribesContent').toggleAttendee(ev.key);
  47. const items = await A.use('tribesContent').listByTribe(s.key, 'event');
  48. eq(items.length, 1);
  49. ok(items[0].attendees.includes(A.keypair.id));
  50. });
  51. t('votation in sub-tribe', async () => {
  52. const net = makeNetwork(); const A = makePeer(net); A.setActor();
  53. const p = await A.use('tribes').createTribe('P', '', null, '', [], false, true, 'strict', null, 'OPEN', '');
  54. const s = await A.use('tribes').createTribe('S', '', null, '', [], false, true, 'strict', p.key, 'OPEN', '');
  55. const v = await A.use('tribesContent').create(s.key, 'votation', { title: 'sub vote', options: ['yes', 'no'] });
  56. await A.use('tribesContent').castVote(v.key, 0);
  57. const items = await A.use('tribesContent').listByTribe(s.key, 'votation');
  58. eq(items.length, 1);
  59. eq(items[0].votes['0'].length, 1);
  60. });
  61. t('sub-tribe content uses sub-tribe key (different fp from parent)', async () => {
  62. const net = makeNetwork(); const A = makePeer(net); A.setActor();
  63. const p = await A.use('tribes').createTribe('P', '', null, '', [], false, true, 'strict', null, 'OPEN', '');
  64. const s = await A.use('tribes').createTribe('S', '', null, '', [], false, true, 'strict', p.key, 'OPEN', '');
  65. const pkey = A.tribeCrypto.getKey(p.key);
  66. const skey = A.tribeCrypto.getKey(s.key);
  67. notOk(pkey === skey, 'parent and sub have different keys');
  68. notOk(A.tribeCrypto.fingerprint(pkey) === A.tribeCrypto.fingerprint(skey));
  69. });
  70. t('parent member with both keys (added to sub manually) can see both', async () => {
  71. const net = makeNetwork(); const A = makePeer(net); const B = makePeer(net);
  72. A.setActor();
  73. const p = await A.use('tribes').createTribe('P', '', null, '', [], false, true, 'strict', null, 'OPEN', '');
  74. const s = await A.use('tribes').createTribe('S', '', null, '', [], false, true, 'strict', p.key, 'OPEN', '');
  75. const codeP = await A.use('tribes').generateInvite(p.key);
  76. const codeS = await A.use('tribes').generateInvite(s.key);
  77. B.setActor();
  78. await B.use('tribes').joinByInvite(codeP);
  79. await B.use('tribes').joinByInvite(codeS);
  80. A.setActor();
  81. await A.use('tribesContent').create(p.key, 'feed', { description: 'in P' });
  82. await A.use('tribesContent').create(s.key, 'feed', { description: 'in S' });
  83. B.setActor();
  84. const pItems = await B.use('tribesContent').listByTribe(p.key, 'feed');
  85. const sItems = await B.use('tribesContent').listByTribe(s.key, 'feed');
  86. eq(pItems.length, 1);
  87. eq(sItems.length, 1);
  88. });
  89. });