@learncard/network-brain-service 3.18.0 → 3.19.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.
Files changed (199) hide show
  1. package/.env.example +4 -0
  2. package/CHANGELOG.md +80 -0
  3. package/compose.inbox.yml +7 -0
  4. package/dist/accesslayer/auth-grant/read.d.ts +1 -0
  5. package/dist/accesslayer/auth-grant/read.d.ts.map +1 -1
  6. package/dist/accesslayer/credential-activity/create.d.ts.map +1 -1
  7. package/dist/accesslayer/credential-refresh/email-delivery.d.ts +18 -0
  8. package/dist/accesslayer/credential-refresh/email-delivery.d.ts.map +1 -0
  9. package/dist/accesslayer/credential-refresh/index.d.ts +1 -0
  10. package/dist/accesslayer/credential-refresh/index.d.ts.map +1 -1
  11. package/dist/accesslayer/credential-refresh/read.d.ts.map +1 -1
  12. package/dist/accesslayer/credential-refresh/update.d.ts.map +1 -1
  13. package/dist/accesslayer/inbox-batch/store.d.ts +33 -0
  14. package/dist/accesslayer/inbox-batch/store.d.ts.map +1 -0
  15. package/dist/accesslayer/inbox-credential/create.d.ts +5 -0
  16. package/dist/accesslayer/inbox-credential/create.d.ts.map +1 -1
  17. package/dist/accesslayer/inbox-credential/refresh.d.ts +71 -0
  18. package/dist/accesslayer/inbox-credential/refresh.d.ts.map +1 -0
  19. package/dist/accesslayer/inbox-credential/update.d.ts +1 -1
  20. package/dist/accesslayer/inbox-credential/update.d.ts.map +1 -1
  21. package/dist/cache/atomic-counter.test-helpers.d.ts +3 -0
  22. package/dist/cache/atomic-counter.test-helpers.d.ts.map +1 -0
  23. package/dist/cache/atomic-counter.test.d.ts +2 -0
  24. package/dist/cache/atomic-counter.test.d.ts.map +1 -0
  25. package/dist/cache/index.d.ts +1 -1
  26. package/dist/cache/index.d.ts.map +1 -1
  27. package/dist/config/environment.d.ts +46 -0
  28. package/dist/config/environment.d.ts.map +1 -1
  29. package/dist/credential-refresh.d.ts.map +1 -1
  30. package/dist/helpers/activity.helpers.d.ts +4 -0
  31. package/dist/helpers/activity.helpers.d.ts.map +1 -1
  32. package/dist/helpers/contact-method.helpers.d.ts.map +1 -1
  33. package/dist/helpers/contact-method.helpers.test.d.ts +2 -0
  34. package/dist/helpers/contact-method.helpers.test.d.ts.map +1 -0
  35. package/dist/helpers/credential-refresh-email-content.helpers.d.ts +44 -0
  36. package/dist/helpers/credential-refresh-email-content.helpers.d.ts.map +1 -0
  37. package/dist/helpers/credential-refresh-email-content.helpers.test.d.ts +2 -0
  38. package/dist/helpers/credential-refresh-email-content.helpers.test.d.ts.map +1 -0
  39. package/dist/helpers/credential-refresh-email.helpers.d.ts +17 -0
  40. package/dist/helpers/credential-refresh-email.helpers.d.ts.map +1 -0
  41. package/dist/helpers/credential-refresh-proof.helpers.d.ts +4 -0
  42. package/dist/helpers/credential-refresh-proof.helpers.d.ts.map +1 -0
  43. package/dist/helpers/credential-refresh-proof.helpers.test.d.ts +2 -0
  44. package/dist/helpers/credential-refresh-proof.helpers.test.d.ts.map +1 -0
  45. package/dist/helpers/credential-refresh.helpers.d.ts +45 -2
  46. package/dist/helpers/credential-refresh.helpers.d.ts.map +1 -1
  47. package/dist/helpers/credential.helpers.d.ts +2 -1
  48. package/dist/helpers/credential.helpers.d.ts.map +1 -1
  49. package/dist/helpers/finalize-inbox.helpers.d.ts.map +1 -1
  50. package/dist/helpers/inbox-batch-http.helpers.d.ts +15 -0
  51. package/dist/helpers/inbox-batch-http.helpers.d.ts.map +1 -0
  52. package/dist/helpers/inbox-batch-http.helpers.test.d.ts +2 -0
  53. package/dist/helpers/inbox-batch-http.helpers.test.d.ts.map +1 -0
  54. package/dist/helpers/inbox-batch-status.helpers.d.ts +3 -0
  55. package/dist/helpers/inbox-batch-status.helpers.d.ts.map +1 -0
  56. package/dist/helpers/inbox-batch.helpers.d.ts +10 -0
  57. package/dist/helpers/inbox-batch.helpers.d.ts.map +1 -0
  58. package/dist/helpers/inbox-batch.helpers.test.d.ts +2 -0
  59. package/dist/helpers/inbox-batch.helpers.test.d.ts.map +1 -0
  60. package/dist/helpers/inbox-issuance-error.helpers.d.ts +13 -0
  61. package/dist/helpers/inbox-issuance-error.helpers.d.ts.map +1 -0
  62. package/dist/helpers/inbox-queue.helpers.d.ts +11 -0
  63. package/dist/helpers/inbox-queue.helpers.d.ts.map +1 -0
  64. package/dist/helpers/inbox-queue.helpers.test.d.ts +2 -0
  65. package/dist/helpers/inbox-queue.helpers.test.d.ts.map +1 -0
  66. package/dist/helpers/inbox-refresh.helpers.d.ts +186 -0
  67. package/dist/helpers/inbox-refresh.helpers.d.ts.map +1 -0
  68. package/dist/helpers/inbox.helpers.d.ts +9 -1
  69. package/dist/helpers/inbox.helpers.d.ts.map +1 -1
  70. package/dist/helpers/notifications.helpers.d.ts.map +1 -1
  71. package/dist/helpers/rateLimit.helpers.d.ts.map +1 -1
  72. package/dist/helpers/refresh-send-intent.helpers.d.ts +51 -0
  73. package/dist/helpers/refresh-send-intent.helpers.d.ts.map +1 -0
  74. package/dist/helpers/shim.d.ts +1 -1
  75. package/dist/helpers/shim.d.ts.map +1 -1
  76. package/dist/inbox-queue-local.d.ts +2 -0
  77. package/dist/inbox-queue-local.d.ts.map +1 -0
  78. package/dist/index.js +2 -2
  79. package/dist/models/AuthGrant.d.ts.map +1 -1
  80. package/dist/models/CredentialActivity.d.ts +1 -0
  81. package/dist/models/CredentialActivity.d.ts.map +1 -1
  82. package/dist/models/CredentialRefresh.d.ts +5 -2
  83. package/dist/models/CredentialRefresh.d.ts.map +1 -1
  84. package/dist/models/InboxCredential.d.ts +1 -0
  85. package/dist/models/InboxCredential.d.ts.map +1 -1
  86. package/dist/models/credential-refresh-constraints.d.ts.map +1 -1
  87. package/dist/openapi.d.ts.map +1 -1
  88. package/dist/routes/act-as.test.d.ts +2 -0
  89. package/dist/routes/act-as.test.d.ts.map +1 -0
  90. package/dist/routes/activity.d.ts +3 -0
  91. package/dist/routes/activity.d.ts.map +1 -1
  92. package/dist/routes/auth-grants.d.ts +10 -0
  93. package/dist/routes/auth-grants.d.ts.map +1 -1
  94. package/dist/routes/boosts.d.ts +494 -0
  95. package/dist/routes/boosts.d.ts.map +1 -1
  96. package/dist/routes/credential-refreshes.d.ts.map +1 -1
  97. package/dist/routes/credentials.d.ts.map +1 -1
  98. package/dist/routes/inbox.d.ts +953 -11
  99. package/dist/routes/inbox.d.ts.map +1 -1
  100. package/dist/routes/index.d.ts +42 -126
  101. package/dist/routes/index.d.ts.map +1 -1
  102. package/dist/routes/workflows.d.ts.map +1 -1
  103. package/dist/services/delivery/adapters/postmark.adapter.d.ts.map +1 -1
  104. package/dist/services/delivery/adapters/postmark.adapter.test.d.ts +2 -0
  105. package/dist/services/delivery/adapters/postmark.adapter.test.d.ts.map +1 -0
  106. package/dist/services/registry/registry.factory.d.ts.map +1 -1
  107. package/dist/types/activity.d.ts +4 -0
  108. package/dist/types/activity.d.ts.map +1 -1
  109. package/dist/types/credential-refresh.d.ts +10 -1
  110. package/dist/types/credential-refresh.d.ts.map +1 -1
  111. package/dist/types/inbox-batch.d.ts +38 -0
  112. package/dist/types/inbox-batch.d.ts.map +1 -0
  113. package/inbox-e2e-setup.ts +53 -1
  114. package/inbox-elasticmq.conf +10 -0
  115. package/lambda.ts +61 -16
  116. package/package.json +18 -16
  117. package/scripts/setup-inbox-queues.ts +60 -0
  118. package/serverless-local.yml +2 -0
  119. package/serverless.yml +75 -0
  120. package/src/accesslayer/auth-grant/read.ts +2 -1
  121. package/src/accesslayer/credential-activity/create.ts +1 -0
  122. package/src/accesslayer/credential-refresh/email-delivery.ts +116 -0
  123. package/src/accesslayer/credential-refresh/index.ts +1 -0
  124. package/src/accesslayer/credential-refresh/read.ts +8 -2
  125. package/src/accesslayer/credential-refresh/update.ts +4 -0
  126. package/src/accesslayer/inbox-batch/store.ts +469 -0
  127. package/src/accesslayer/inbox-credential/create.ts +51 -19
  128. package/src/accesslayer/inbox-credential/refresh.ts +221 -0
  129. package/src/accesslayer/inbox-credential/update.ts +1 -1
  130. package/src/cache/atomic-counter.test-helpers.ts +27 -0
  131. package/src/cache/atomic-counter.test.ts +6 -0
  132. package/src/cache/index.ts +25 -13
  133. package/src/config/environment.ts +26 -0
  134. package/src/credential-refresh.ts +5 -1
  135. package/src/docker-entry.ts +8 -0
  136. package/src/helpers/activity.helpers.ts +4 -0
  137. package/src/helpers/app-counter.helpers.ts +1 -1
  138. package/src/helpers/contact-method.helpers.test.ts +43 -0
  139. package/src/helpers/contact-method.helpers.ts +3 -4
  140. package/src/helpers/credential-refresh-email-content.helpers.test.ts +222 -0
  141. package/src/helpers/credential-refresh-email-content.helpers.ts +155 -0
  142. package/src/helpers/credential-refresh-email.helpers.ts +201 -0
  143. package/src/helpers/credential-refresh-proof.helpers.test.ts +103 -0
  144. package/src/helpers/credential-refresh-proof.helpers.ts +43 -0
  145. package/src/helpers/credential-refresh.helpers.ts +375 -99
  146. package/src/helpers/credential.helpers.ts +4 -1
  147. package/src/helpers/finalize-inbox.helpers.ts +29 -14
  148. package/src/helpers/inbox-batch-http.helpers.test.ts +188 -0
  149. package/src/helpers/inbox-batch-http.helpers.ts +150 -0
  150. package/src/helpers/inbox-batch-status.helpers.ts +11 -0
  151. package/src/helpers/inbox-batch.helpers.test.ts +668 -0
  152. package/src/helpers/inbox-batch.helpers.ts +374 -0
  153. package/src/helpers/inbox-issuance-error.helpers.ts +25 -0
  154. package/src/helpers/inbox-queue.helpers.test.ts +253 -0
  155. package/src/helpers/inbox-queue.helpers.ts +372 -0
  156. package/src/helpers/inbox-refresh.helpers.ts +432 -0
  157. package/src/helpers/inbox.helpers.ts +268 -32
  158. package/src/helpers/notifications.helpers.ts +4 -2
  159. package/src/helpers/rateLimit.helpers.ts +2 -5
  160. package/src/helpers/refresh-send-intent.helpers.ts +273 -0
  161. package/src/helpers/shim.ts +32 -31
  162. package/src/inbox-queue-local.ts +28 -0
  163. package/src/models/AuthGrant.ts +1 -0
  164. package/src/models/CredentialActivity.ts +3 -5
  165. package/src/models/CredentialRefresh.ts +4 -2
  166. package/src/models/InboxCredential.ts +2 -0
  167. package/src/models/credential-refresh-constraints.test.ts +8 -3
  168. package/src/models/credential-refresh-constraints.ts +5 -0
  169. package/src/openapi.ts +8 -0
  170. package/src/routes/act-as.test.ts +239 -0
  171. package/src/routes/app-store.ts +2 -2
  172. package/src/routes/auth-grants.ts +13 -11
  173. package/src/routes/boosts.ts +914 -92
  174. package/src/routes/credential-refreshes.test.ts +8 -2
  175. package/src/routes/credential-refreshes.ts +4 -1
  176. package/src/routes/credentials.ts +2 -1
  177. package/src/routes/inbox.ts +95 -49
  178. package/src/routes/index.ts +82 -7
  179. package/src/routes/skills.ts +1 -1
  180. package/src/routes/workflows.ts +43 -24
  181. package/src/services/delivery/adapters/postmark.adapter.test.ts +54 -0
  182. package/src/services/delivery/adapters/postmark.adapter.ts +12 -0
  183. package/src/services/registry/registry.factory.ts +2 -1
  184. package/src/types/activity.ts +2 -0
  185. package/src/types/credential-refresh.ts +21 -2
  186. package/src/types/inbox-batch.ts +46 -0
  187. package/test/atomic-counter.e2e.ts +12 -0
  188. package/test/auth-grant.spec.ts +21 -21
  189. package/test/credential-refresh-email.spec.ts +663 -0
  190. package/test/credential-refresh-publication.spec.ts +2 -0
  191. package/test/helpers/inbox-e2e-environment.ts +6 -0
  192. package/test/inbox-batch.spec.ts +1338 -0
  193. package/test/inbox-refresh.spec.ts +534 -0
  194. package/test/openapi.spec.ts +41 -1
  195. package/test/refresh-send.spec.ts +1799 -0
  196. package/test/registry.spec.ts +56 -11
  197. package/vitest.config.ts +9 -0
  198. package/vitest.inbox-e2e.config.ts +5 -1
  199. package/vitest.integration.config.ts +2 -0
@@ -33,6 +33,7 @@ export const CredentialActivityValidator = z.object({
33
33
  eventType: CredentialActivityEventTypeValidator,
34
34
  timestamp: z.string(),
35
35
  actorProfileId: z.string().optional(),
36
+ onBehalfOf: z.string().optional(),
36
37
  recipientType: CredentialActivityRecipientTypeValidator,
37
38
  recipientIdentifier: z.string(),
38
39
  boostUri: z.string().optional(),
@@ -85,6 +86,7 @@ export const CredentialActivityStatsValidator = z.object({
85
86
  export type CredentialActivityStats = z.infer<typeof CredentialActivityStatsValidator>;
86
87
 
87
88
  export type LogCredentialActivityParams = {
89
+ onBehalfOf?: string;
88
90
  actorProfileId?: string;
89
91
  eventType: CredentialActivityEventType;
90
92
  recipientType: CredentialActivityRecipientType;
@@ -12,17 +12,26 @@ import {
12
12
  * immutable Credential nodes as holder-encrypted JWE JSON — never plaintext VC JSON.
13
13
  */
14
14
 
15
- export const CredentialRefreshStateValidator = z.enum(['awaiting_claim', 'active', 'revoked']);
15
+ export const CredentialRefreshStateValidator = z.enum([
16
+ 'pending_holder',
17
+ 'awaiting_claim',
18
+ 'active',
19
+ 'revoked',
20
+ ]);
16
21
  export type CredentialRefreshState = z.infer<typeof CredentialRefreshStateValidator>;
17
22
 
18
23
  /** The managed refresh aggregate node (metadata only — no credential bodies) */
19
24
  export const CredentialRefreshRecordValidator = z.object({
25
+ /** Pending Universal Inbox delivery associated with this aggregate. */
26
+ inboxCredentialId: z.string().optional(),
27
+ /** Public status mechanism coordinates retained for the issuer allocation receipt. */
28
+ inboxCredentialStatus: z.string().optional(),
20
29
  /** Cryptographically random, unguessable public route identifier */
21
30
  refreshId: z.string().min(1),
22
31
  issuerProfileId: z.string().min(1),
23
32
  issuerDid: z.string().min(1),
24
33
  holderProfileId: z.string().min(1).optional(),
25
- holderDid: z.string().min(1),
34
+ holderDid: z.string().min(1).optional(),
26
35
  /** Stable nonempty VC identifier shared by every version */
27
36
  credentialId: z.string().min(1),
28
37
  state: CredentialRefreshStateValidator,
@@ -45,6 +54,12 @@ export const CredentialRefreshRecordValidator = z.object({
45
54
  idempotencyKey: z.string().optional(),
46
55
  /** Issuer-authored, privacy-safe update summary */
47
56
  updateSummary: z.string().optional(),
57
+ /**
58
+ * Bounded, normalized credential display title used only for the email update
59
+ * notice. Never rendered in in-app/push payloads. Sourced from the unsigned
60
+ * publish input or the original boost template; never from decrypted content.
61
+ */
62
+ credentialDisplayName: z.string().optional(),
48
63
  lastPublishedAt: z.string().optional(),
49
64
  /** Notification delivery window key used to collapse repeat notifications */
50
65
  notificationWindowKey: z.string().optional(),
@@ -93,6 +108,8 @@ export const CredentialRefreshVersionNodeValidator = z.object({
93
108
  etag: z.string().optional(),
94
109
  signingMode: CredentialRefreshSigningModeValidator,
95
110
  updateSummary: z.string().optional(),
111
+ /** Bounded credential display title for the email update notice only. */
112
+ credentialDisplayName: z.string().optional(),
96
113
  /** Caller-provided key for replaying this exact historical publication */
97
114
  idempotencyKey: z.string().optional(),
98
115
  /** Aggregate-scoped unique key used to enforce historical idempotency */
@@ -132,6 +149,8 @@ export const AdvanceCredentialRefreshHeadParamsValidator = z.object({
132
149
  materialDigest: z.string().optional(),
133
150
  signingMode: CredentialRefreshSigningModeValidator,
134
151
  updateSummary: z.string().optional(),
152
+ /** Bounded credential display title persisted for the email update notice only. */
153
+ credentialDisplayName: z.string().optional(),
135
154
  idempotencyKey: z.string().optional(),
136
155
  /** Aggregate state observed by the caller; prevents claim/revocation races. */
137
156
  expectedState: CredentialRefreshStateValidator.optional(),
@@ -0,0 +1,46 @@
1
+ import type { InboxBatchStatus, IssueInboxCredentialBatch } from '@learncard/types';
2
+ import type { Context } from '@routes';
3
+
4
+ export type BatchItem = {
5
+ id: string;
6
+ batchId: string;
7
+ index: number;
8
+ state: InboxBatchStatus['items'][number]['state'];
9
+ phase?: 'PREPARING' | 'ISSUING';
10
+ owner?: string;
11
+ leaseUntil?: number;
12
+ attempts: number;
13
+ result?: string;
14
+ replayKey: string;
15
+ duplicate: boolean;
16
+ /** Encrypted client correlation fields retained after the batch payload is removed. */
17
+ correlation?: string;
18
+ };
19
+
20
+ export type InboxDispatchLease = { id: string; dispatchAt: number };
21
+
22
+ export type BatchJob = {
23
+ id: string;
24
+ issuer: string;
25
+ createdAt: number;
26
+ payload?: string;
27
+ completedAt?: number;
28
+ };
29
+
30
+ export type BatchJobPayload = {
31
+ batch: IssueInboxCredentialBatch;
32
+ context: Pick<Context, 'domain' | 'tenant'>;
33
+ /** Submitting caller's permissions, retained for deferred refresh authorization. */
34
+ scope?: string;
35
+ };
36
+
37
+ export type BatchReplayStore = {
38
+ get: (key: string) => Promise<string | null | undefined>;
39
+ setIfAbsent: (key: string, value: string, ttl: number) => Promise<'OK' | null | undefined>;
40
+ compareAndSet: (
41
+ key: string,
42
+ expected: string,
43
+ value: string | null,
44
+ ttl: number
45
+ ) => Promise<boolean | undefined>;
46
+ };
@@ -0,0 +1,12 @@
1
+ import { afterAll, expect, it } from 'vitest';
2
+ import cache from '@cache';
3
+ import { testAtomicCacheCounter } from '../src/cache/atomic-counter.test-helpers';
4
+
5
+ // Fail if the isolated Redis container is missing; never silently test the mock in CI.
6
+ it('uses real Redis for the atomic counter contract', () => {
7
+ expect(cache.redis).toBeDefined();
8
+ });
9
+ testAtomicCacheCounter(cache);
10
+ afterAll(async () => {
11
+ await cache.redis?.quit();
12
+ });
@@ -200,7 +200,7 @@ describe('Auth Grants', () => {
200
200
 
201
201
  const authGrants = await userA.clients.fullAuth.authGrants.getAuthGrants();
202
202
  expect(authGrants).toHaveLength(1);
203
- expect((authGrants[0] as any).id).toEqual(authGrantId);
203
+ expect(authGrants[0]?.id).toEqual(authGrantId);
204
204
 
205
205
  await userA.clients.fullAuth.authGrants.addAuthGrant({
206
206
  name: 'test2',
@@ -209,8 +209,8 @@ describe('Auth Grants', () => {
209
209
  const authGrants2 = await userA.clients.fullAuth.authGrants.getAuthGrants();
210
210
 
211
211
  expect(authGrants2).toHaveLength(2);
212
- expect(authGrants2[0] as any).toBeDefined();
213
- expect(authGrants2[1] as any).toBeDefined();
212
+ expect(authGrants2[0]).toBeDefined();
213
+ expect(authGrants2[1]).toBeDefined();
214
214
  });
215
215
 
216
216
  it('should accept a limit', async () => {
@@ -247,7 +247,7 @@ describe('Auth Grants', () => {
247
247
  });
248
248
 
249
249
  expect(authGrants).toHaveLength(1);
250
- expect((authGrants[0] as any).id).toEqual(authGrantId);
250
+ expect(authGrants[0]?.id).toEqual(authGrantId);
251
251
  });
252
252
  });
253
253
 
@@ -278,17 +278,18 @@ describe('Auth Grants', () => {
278
278
  id: authGrantId,
279
279
  });
280
280
 
281
- expect((updatedAuthGrant as any).name).toEqual('test2');
281
+ expect(updatedAuthGrant?.name).toEqual('test2');
282
282
  });
283
283
 
284
- it('should not allow you to update the scopes, challenge, id, createdAt, expiresAt, status of an auth grant', async () => {
284
+ it('should reject updates to the scopes, actAs, challenge, id, createdAt, expiresAt, status of an auth grant', async () => {
285
285
  await userA.clients.fullAuth.profile.createProfile({ profileId: 'usera' });
286
286
  const authGrantId = await userA.clients.fullAuth.authGrants.addAuthGrant({
287
287
  name: 'test',
288
288
  });
289
289
 
290
- const invalidUpdates: any = {
290
+ const invalidUpdates: Record<string, string> = {
291
291
  scope: '*:*',
292
+ actAs: '*',
292
293
  challenge: 'test',
293
294
  id: 'test',
294
295
  createdAt: 'test',
@@ -296,27 +297,26 @@ describe('Auth Grants', () => {
296
297
  status: 'revoked',
297
298
  };
298
299
 
299
- for (const key in invalidUpdates) {
300
+ for (const [key, value] of Object.entries(invalidUpdates)) {
300
301
  await expect(
301
302
  userA.clients.fullAuth.authGrants.updateAuthGrant({
302
303
  id: authGrantId,
303
- updates: {
304
- [key]: invalidUpdates[key],
305
- },
304
+ updates: { [key]: value } as never,
306
305
  })
307
- ).resolves.toBe(false);
306
+ ).rejects.toMatchObject({ code: 'BAD_REQUEST' });
308
307
  }
309
308
 
310
309
  const updatedAuthGrant = await userA.clients.fullAuth.authGrants.getAuthGrant({
311
310
  id: authGrantId,
312
311
  });
313
312
 
314
- expect((updatedAuthGrant as any).scope).toEqual(AUTH_GRANT_READ_ONLY_SCOPE);
315
- expect((updatedAuthGrant as any).challenge).not.toEqual('test');
316
- expect((updatedAuthGrant as any).id).not.toEqual('test');
317
- expect((updatedAuthGrant as any).createdAt).not.toEqual('test');
318
- expect((updatedAuthGrant as any).expiresAt).not.toEqual('test');
319
- expect((updatedAuthGrant as any).status).not.toEqual('revoked');
313
+ expect(updatedAuthGrant).toMatchObject({ scope: AUTH_GRANT_READ_ONLY_SCOPE });
314
+ expect(updatedAuthGrant?.challenge).not.toEqual('test');
315
+ expect(updatedAuthGrant?.id).not.toEqual('test');
316
+ expect(updatedAuthGrant?.createdAt).not.toEqual('test');
317
+ expect(updatedAuthGrant?.expiresAt).not.toEqual('test');
318
+ expect(updatedAuthGrant?.status).not.toEqual('revoked');
319
+ expect(updatedAuthGrant?.actAs).toBeUndefined();
320
320
  });
321
321
 
322
322
  // it('should not allow you to update an auth grant for a scoped user profile', async () => {
@@ -366,7 +366,7 @@ describe('Auth Grants', () => {
366
366
  id: authGrantId,
367
367
  });
368
368
 
369
- expect((updatedAuthGrant as any).name).toEqual('test2');
369
+ expect(updatedAuthGrant?.name).toEqual('test2');
370
370
  });
371
371
 
372
372
  it("should not allow you to update someone else's auth grant", async () => {
@@ -511,7 +511,7 @@ describe('Auth Grants', () => {
511
511
  id: authGrantId,
512
512
  });
513
513
 
514
- expect((authGrant as any).status).toEqual(AuthGrantStatusValidator.enum.revoked);
514
+ expect(authGrant?.status).toEqual(AuthGrantStatusValidator.enum.revoked);
515
515
  });
516
516
 
517
517
  // it('should not allow you to revoke an auth grant for a scoped user profile', async () => {
@@ -552,7 +552,7 @@ describe('Auth Grants', () => {
552
552
  id: authGrantId,
553
553
  });
554
554
 
555
- expect((authGrant as any).status).toEqual(AuthGrantStatusValidator.enum.revoked);
555
+ expect(authGrant?.status).toEqual(AuthGrantStatusValidator.enum.revoked);
556
556
  });
557
557
 
558
558
  it("should not allow you to revoke someone else's auth grant", async () => {