|
1 | 1 | import test from 'ava'; |
2 | 2 | import { |
3 | 3 | base64URLEncodeNoPadding, |
| 4 | + generateUpdateWorkflowOperationToken, |
4 | 5 | generateWorkflowRunOperationToken, |
5 | 6 | loadOperationToken, |
| 7 | + loadUpdateWorkflowOperationToken, |
6 | 8 | loadWorkflowRunOperationToken, |
7 | 9 | } from '../token'; |
8 | 10 |
|
@@ -47,3 +49,69 @@ test('decode workflow run Operation token errors', (t) => { |
47 | 49 | message: /invalid workflow run token: missing workflow ID \(wid\)/, |
48 | 50 | }); |
49 | 51 | }); |
| 52 | + |
| 53 | +test('encode and decode update workflow Operation token', (t) => { |
| 54 | + const expected = { |
| 55 | + t: 3, |
| 56 | + ns: 'ns', |
| 57 | + wid: 'w', |
| 58 | + rid: 'r', |
| 59 | + uid: 'u', |
| 60 | + }; |
| 61 | + const token = generateUpdateWorkflowOperationToken('ns', 'w', 'r', 'u'); |
| 62 | + const decoded = loadUpdateWorkflowOperationToken(token); |
| 63 | + t.deepEqual(decoded, expected); |
| 64 | +}); |
| 65 | + |
| 66 | +test('update workflow Operation token matches Go wire format byte-for-byte', (t) => { |
| 67 | + // Field order and names must match the Go SDK's json.Marshal output: t, ns, wid, rid, uid. |
| 68 | + // The version field ("v") must be absent. |
| 69 | + const token = generateUpdateWorkflowOperationToken('ns', 'w', 'r', 'u'); |
| 70 | + const decodedJSON = Buffer.from(token, 'base64url').toString('utf-8'); |
| 71 | + t.is(decodedJSON, '{"t":3,"ns":"ns","wid":"w","rid":"r","uid":"u"}'); |
| 72 | +}); |
| 73 | + |
| 74 | +test('encode update workflow Operation token with empty runId omits rid', (t) => { |
| 75 | + const token = generateUpdateWorkflowOperationToken('ns', 'w', '', 'u'); |
| 76 | + const decodedJSON = Buffer.from(token, 'base64url').toString('utf-8'); |
| 77 | + // `rid` is optional: it must be omitted entirely rather than emitted as an empty string. |
| 78 | + t.is(decodedJSON, '{"t":3,"ns":"ns","wid":"w","uid":"u"}'); |
| 79 | + |
| 80 | + const parsed = JSON.parse(decodedJSON); |
| 81 | + t.false('rid' in parsed); |
| 82 | + |
| 83 | + // Round-trips: the load side tolerates an absent rid, yielding no pinned run. |
| 84 | + const decoded = loadUpdateWorkflowOperationToken(token); |
| 85 | + t.deepEqual(decoded, { t: 3, ns: 'ns', wid: 'w', uid: 'u' }); |
| 86 | + t.is(decoded.rid, undefined); |
| 87 | +}); |
| 88 | + |
| 89 | +test('load update workflow Operation token tolerates legacy empty rid', (t) => { |
| 90 | + // Legacy tokens may carry rid:"" explicitly; it must be accepted and treated as no pinned run. |
| 91 | + const legacyToken = base64URLEncodeNoPadding('{"t":3,"ns":"ns","wid":"w","rid":"","uid":"u"}'); |
| 92 | + const decoded = loadUpdateWorkflowOperationToken(legacyToken); |
| 93 | + t.deepEqual(decoded, { t: 3, ns: 'ns', wid: 'w', rid: '', uid: 'u' }); |
| 94 | +}); |
| 95 | + |
| 96 | +test('generate update workflow Operation token validates required params', (t) => { |
| 97 | + t.throws(() => generateUpdateWorkflowOperationToken('', 'w', 'r', 'u'), { message: /namespace/ }); |
| 98 | + t.throws(() => generateUpdateWorkflowOperationToken('ns', '', 'r', 'u'), { message: /workflow ID/ }); |
| 99 | + t.throws(() => generateUpdateWorkflowOperationToken('ns', 'w', 'r', ''), { message: /update ID/ }); |
| 100 | +}); |
| 101 | + |
| 102 | +test('decode update workflow Operation token errors', (t) => { |
| 103 | + const wrongTypeToken = base64URLEncodeNoPadding('{"t":1,"ns":"ns","wid":"w"}'); |
| 104 | + t.throws(() => loadUpdateWorkflowOperationToken(wrongTypeToken), { |
| 105 | + message: /invalid update workflow token type: 1, expected: 3/, |
| 106 | + }); |
| 107 | + |
| 108 | + const missingWIDToken = base64URLEncodeNoPadding('{"t":3,"ns":"ns","uid":"u"}'); |
| 109 | + t.throws(() => loadUpdateWorkflowOperationToken(missingWIDToken), { |
| 110 | + message: /invalid update workflow token: missing workflow ID \(wid\)/, |
| 111 | + }); |
| 112 | + |
| 113 | + const missingUIDToken = base64URLEncodeNoPadding('{"t":3,"ns":"ns","wid":"w"}'); |
| 114 | + t.throws(() => loadUpdateWorkflowOperationToken(missingUIDToken), { |
| 115 | + message: /invalid update workflow token: missing update ID \(uid\)/, |
| 116 | + }); |
| 117 | +}); |
0 commit comments