@tellescope/sdk 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -431,6 +431,7 @@ const validateReturnType = <N extends ModelName, T=ClientModelForName[N]>(fs: Mo
431
431
 
432
432
  let defaultEnduser = undefined as Enduser | undefined
433
433
  const run_generated_tests = async <N extends ModelName>({ queries, model, name, returns } : GeneratedTest<N>) => {
434
+ if (name === 'post_likes') return // all custom
434
435
  if (!defaultEnduser) defaultEnduser = await sdk.api.endusers.createOne({ email: 'default@tellescope.com', phone: "5555555555" })
435
436
 
436
437
  const { instance, updates, filter } = instanceForModel(model)
@@ -456,9 +457,10 @@ const run_generated_tests = async <N extends ModelName>({ queries, model, name,
456
457
  await async_test(
457
458
  `create-${singularName} (missing a required field)`,
458
459
  () => queries.createOne({} as any),
459
- { shouldError: true, onError: e => e.message.endsWith('is required') },
460
+ { shouldError: true, onError: e => e.message.endsWith('is required') || e.message.includes('Value not provided') },
460
461
  )
461
462
  }
463
+
462
464
  await async_test(
463
465
  `create-${singularName}`,
464
466
  () => queries.createOne(instance),
@@ -1341,6 +1343,8 @@ const users_tests = async () => {
1341
1343
  }
1342
1344
 
1343
1345
  const calendar_events_tests = async () => {
1346
+ log_header("Calendar Events")
1347
+
1344
1348
  const { id } = await sdk.api.endusers.createOne({ email })
1345
1349
  const { authToken, enduser } = await sdk.api.endusers.generate_auth_token({ id })
1346
1350
  const enduserSDK = new EnduserSession({ host, authToken, enduser, businessId: sdk.userInfo.businessId })
@@ -1351,6 +1355,9 @@ const calendar_events_tests = async () => {
1351
1355
  const eventWithEnduser = await sdk.api.calendar_events.createOne({
1352
1356
  title: "Event with Enduser", durationInMinutes: 30, startTimeInMS: Date.now(), attendees: [{ id, type: 'enduser' }]
1353
1357
  })
1358
+ const publicEvent = await sdk.api.calendar_events.createOne({
1359
+ title: "Event", durationInMinutes: 30, startTimeInMS: Date.now(), publicRead: true,
1360
+ })
1354
1361
 
1355
1362
  await async_test(
1356
1363
  `user can access own event`,
@@ -1358,9 +1365,20 @@ const calendar_events_tests = async () => {
1358
1365
  { onResult: e => e && e.id === event.id }
1359
1366
  )
1360
1367
  await async_test(
1361
- `user can access own events`,
1368
+ `user can access public event`,
1369
+ () => sdk.api.calendar_events.getOne(publicEvent.id),
1370
+ { onResult: e => e && e.id === publicEvent.id }
1371
+ )
1372
+ // TODO: implement support for publicRead for users,
1373
+ // await async_test(
1374
+ // `non-creator, non-admin user can access public event`,
1375
+ // () => sdkNonAdmin.api.calendar_events.getOne(publicEvent.id),
1376
+ // { onResult: e => e && e.id === event.id }
1377
+ // )
1378
+ await async_test(
1379
+ `user can access own events and public events`,
1362
1380
  () => sdk.api.calendar_events.getSome(),
1363
- { onResult: es => es && es.length === 2 }
1381
+ { onResult: es => es && es.length === 3 }
1364
1382
  )
1365
1383
  await async_test(
1366
1384
  `user can access own event with enduser attendee`,
@@ -1379,12 +1397,32 @@ const calendar_events_tests = async () => {
1379
1397
  { onResult: e => e && e.id === eventWithEnduser.id }
1380
1398
  )
1381
1399
  await async_test(
1382
- `enduser can access own events`,
1400
+ `enduser can access public event`,
1401
+ () => enduserSDK.api.calendar_events.getOne(publicEvent.id),
1402
+ { onResult: e => e && e.id === publicEvent.id }
1403
+ )
1404
+ await async_test(
1405
+ `enduser can access own events and public events`,
1383
1406
  () => enduserSDK.api.calendar_events.getSome(),
1384
- { onResult: es => es && es.length === 1 }
1407
+ { onResult: es => es && es.length === 2 }
1408
+ )
1409
+ await async_test(
1410
+ `enduser cannot update publicEvent `,
1411
+ () => enduserSDK.api.calendar_events.updateOne(publicEvent.id, { title: "CHANGED "}),
1412
+ handleAnyError
1413
+ )
1414
+ await async_test(
1415
+ `enduser cannot delete publicEvent`,
1416
+ () => enduserSDK.api.calendar_events.deleteOne(publicEvent.id),
1417
+ handleAnyError
1385
1418
  )
1386
1419
 
1387
- await sdk.api.endusers.deleteOne(enduser.id)
1420
+ await Promise.all([
1421
+ sdk.api.endusers.deleteOne(enduser.id),
1422
+ sdk.api.calendar_events.deleteOne(event.id),
1423
+ sdk.api.calendar_events.deleteOne(eventWithEnduser.id),
1424
+ sdk.api.calendar_events.deleteOne(publicEvent.id),
1425
+ ])
1388
1426
  }
1389
1427
 
1390
1428
  const automation_events_tests = async () => {
@@ -1436,6 +1474,13 @@ const form_response_tests = async () => {
1436
1474
  export const meetings_tests = async () => {
1437
1475
  log_header("Meetings")
1438
1476
 
1477
+ const enduser = await sdk.api.endusers.createOne({ email })
1478
+ await sdk.api.endusers.set_password({ id: enduser.id, password }).catch(console.error)
1479
+ await enduserSDK.authenticate(email, password).catch(console.error)
1480
+
1481
+ const privateMeeting = await sdk.api.meetings.start_meeting({ })
1482
+ const publicMeeting = await sdk.api.meetings.start_meeting({ publicRead: true })
1483
+
1439
1484
  await async_test(
1440
1485
  `Admin can get meetings`,
1441
1486
  sdk.api.meetings.getSome,
@@ -1446,6 +1491,23 @@ export const meetings_tests = async () => {
1446
1491
  sdkNonAdmin.api.meetings.getSome,
1447
1492
  { shouldError: true, onError: e => e.message === "Admin access only" },
1448
1493
  )
1494
+
1495
+ await async_test(
1496
+ `Enduser can access public meeting, not private meeting`,
1497
+ enduserSDK.api.meetings.my_meetings,
1498
+ { onResult: ms => ms.length === 1 && !!ms.find(m => m.id === publicMeeting.id) }
1499
+ )
1500
+
1501
+ await Promise.all([
1502
+ sdk.api.meetings.end_meeting({ id: publicMeeting.id }),
1503
+ sdk.api.meetings.end_meeting({ id: privateMeeting.id }),
1504
+ sdk.api.endusers.deleteOne(enduser.id),
1505
+ ])
1506
+
1507
+ // await Promise.all([
1508
+ // sdk.api.meetings.deleteOne(publicMeeting.id),
1509
+ // sdk.api.meetings.deleteOne(privateMeeting.id),
1510
+ // ])
1449
1511
  }
1450
1512
 
1451
1513
  const search_tests = async () => {
@@ -1533,7 +1595,7 @@ const role_based_access_tests = async () => {
1533
1595
 
1534
1596
  const chatRoom = await sdk.api.chat_rooms.createOne({ enduserIds: [e.id ]})
1535
1597
  const chatMessage = await sdk.api.chats.createOne({ roomId: chatRoom.id, message: 'test chat access' })
1536
- const chatMessage2 = await sdk.api.chats.createOne({ roomId: chatRoom.id, message: 'test chat access 2' })
1598
+ await sdk.api.chats.createOne({ roomId: chatRoom.id, message: 'test chat access 2' })
1537
1599
 
1538
1600
  // unassigned to enduser access tests
1539
1601
  await async_test(
@@ -1683,6 +1745,121 @@ const status_update_tests = async () => {
1683
1745
  ])
1684
1746
  }
1685
1747
 
1748
+ const community_tests = async () => {
1749
+ log_header("Community")
1750
+
1751
+ const enduser = await sdk.api.endusers.createOne({ email })
1752
+ await sdk.api.endusers.set_password({ id: enduser.id, password }).catch(console.error)
1753
+ await enduserSDK.authenticate(email, password).catch(console.error)
1754
+
1755
+ const forum = await sdk.api.forums.createOne({ title: 'test', publicRead: true })
1756
+ const privateForum = await sdk.api.forums.createOne({ title: 'test', publicRead: false })
1757
+
1758
+ await async_test(
1759
+ `enduser access forum`, () => enduserSDK.api.forums.getOne(forum.id), { onResult: f => f.id === forum.id }
1760
+ )
1761
+ await async_test(`enduser access privateForum error`, () => enduserSDK.api.forums.getOne(privateForum.id), handleAnyError)
1762
+
1763
+ const enduserPost = await enduserSDK.api.forum_posts.createOne({ forumId: forum.id, htmlContent: 'enduser', textContent: 'enduser' })
1764
+ assert(!!enduserPost, 'enduser post failed', 'enduser post successful')
1765
+ const userPost = await sdk.api.forum_posts.createOne({ forumId: forum.id, htmlContent: 'user', textContent: 'user' })
1766
+ assert(!!userPost, 'user post failed', 'user post successful')
1767
+
1768
+ assert(enduserPost.numComments === 0 && enduserPost.numLikes === 0, 'counts not initialized', 'counts initialized at 0')
1769
+
1770
+ await async_test(
1771
+ `enduser post private errors`,
1772
+ () => enduserSDK.api.forum_posts.createOne({ forumId: privateForum.id, htmlContent: 'enduser', textContent: 'enduser' }),
1773
+ handleAnyError
1774
+ )
1775
+
1776
+ const enduserSelfComment = await enduserSDK.api.post_comments.createOne({ forumId: forum.id, postId: enduserPost.id, htmlContent: 'enduser', textContent: 'enduser' })
1777
+ const userComment = await sdk.api.post_comments.createOne({ forumId: forum.id, postId: enduserPost.id, htmlContent: 'user', textContent: 'user' })
1778
+ assert(!!enduserSelfComment, 'enduser comment failed', 'enduser comment successful')
1779
+ assert(!!userComment, 'user comment failed', 'user comment successful')
1780
+
1781
+ await enduserSDK.api.post_likes.createOne({ forumId: forum.id, postId: enduserPost.id })
1782
+ await async_test(
1783
+ `double-like not allowed`,
1784
+ () => enduserSDK.api.post_likes.createOne({ forumId: forum.id, postId: enduserPost.id }),
1785
+ handleAnyError
1786
+ )
1787
+
1788
+ await wait(undefined, 50)
1789
+ await async_test(
1790
+ `post and like counts on create`,
1791
+ () => sdk.api.forum_posts.getOne(enduserPost.id),
1792
+ { onResult: p => p.numComments === 2 && p.numLikes === 1}
1793
+ )
1794
+
1795
+ await enduserSDK.api.post_likes.unlike_post({ postId: enduserPost.id, forumId: enduserPost.forumId })
1796
+ await wait(undefined, 50)
1797
+ await async_test(
1798
+ `post and like counts after unlike`,
1799
+ () => sdk.api.forum_posts.getOne(enduserPost.id),
1800
+ { onResult: p => p.numComments === 2 && p.numLikes === 0 }
1801
+ )
1802
+
1803
+
1804
+ const userSelfPost = await sdk.api.forum_posts.createOne({ forumId: privateForum.id, htmlContent: 'user', textContent: 'user' })
1805
+ assert(!!userSelfPost, 'user private post failed', 'user private post successful')
1806
+
1807
+ const userSelfPostComment = await sdk.api.post_comments.createOne({ forumId: privateForum.id, postId: userSelfPost.id, htmlContent: 'user', textContent: 'user' })
1808
+ assert(!!userSelfPostComment, 'user private post comment failed', 'user private post comment successful')
1809
+
1810
+ await async_test(
1811
+ `enduser comment private errors`,
1812
+ () => enduserSDK.api.post_comments.createOne({ forumId: privateForum.id, postId: userSelfPost.id, htmlContent: 'enduser', textContent: 'enduser' }),
1813
+ handleAnyError
1814
+ )
1815
+ await async_test(
1816
+ 'enduser cannot access private post by id',
1817
+ () => enduserSDK.api.forum_posts.getOne(userSelfPost.id),
1818
+ handleAnyError,
1819
+ )
1820
+ await async_test(
1821
+ 'enduser cannot access private post by filter',
1822
+ () => enduserSDK.api.forum_posts.getOne({ forumId: privateForum.id }),
1823
+ handleAnyError,
1824
+ )
1825
+ await async_test(
1826
+ 'enduser cannot access private comment by id',
1827
+ () => enduserSDK.api.post_comments.getOne(userSelfPostComment.id),
1828
+ handleAnyError,
1829
+ )
1830
+ await async_test(
1831
+ 'enduser cannot access private comment by filter (forum id)',
1832
+ () => enduserSDK.api.post_comments.getOne({ forumId: privateForum.id }),
1833
+ handleAnyError,
1834
+ )
1835
+ await async_test(
1836
+ 'enduser cannot access private comment by filter (post id)',
1837
+ () => enduserSDK.api.post_comments.getOne({ postId: userSelfPost.id }),
1838
+ handleAnyError,
1839
+ )
1840
+ await async_test(
1841
+ 'enduser cannot access private comment by filter (forum and post id)',
1842
+ () => enduserSDK.api.post_comments.getOne({ forumId: privateForum.id, postId: userSelfPost.id }),
1843
+ handleAnyError,
1844
+ )
1845
+ await async_test(
1846
+ 'enduser cannot access private posts',
1847
+ () => enduserSDK.api.forum_posts.getSome({ filter: { forumId: privateForum.id }}),
1848
+ { onResult: posts => posts.length === 0 },
1849
+ )
1850
+ await async_test(
1851
+ 'enduser cannot access private comments',
1852
+ () => enduserSDK.api.post_comments.getSome({ filter: { forumId: privateForum.id }}),
1853
+ { onResult: comments => comments.length === 0 },
1854
+ )
1855
+
1856
+ await Promise.all([
1857
+ await sdk.api.endusers.deleteOne(enduser.id),
1858
+ await sdk.api.forums.deleteOne(forum.id),
1859
+ await sdk.api.forums.deleteOne(privateForum.id),
1860
+ ])
1861
+ }
1862
+
1686
1863
  const NO_TEST = () => {}
1687
1864
  const tests: { [K in keyof ClientModelForName]: () => void } = {
1688
1865
  chats: chat_tests,
@@ -1710,6 +1887,12 @@ const tests: { [K in keyof ClientModelForName]: () => void } = {
1710
1887
  enduser_status_updates: status_update_tests,
1711
1888
  user_logs: NO_TEST,
1712
1889
  user_notifications: notifications_tests,
1890
+ enduser_observations: NO_TEST,
1891
+ forum_posts: NO_TEST,
1892
+ forums: community_tests,
1893
+ managed_content_records: NO_TEST,
1894
+ post_comments: NO_TEST,
1895
+ post_likes: NO_TEST,
1713
1896
  };
1714
1897
 
1715
1898
  (async () => {