[READ-ONLY] a fast, modern browser for the npm registry
at main 162 lines 4.8 kB view raw
1import { describe, expect, it, beforeEach } from 'vitest' 2import { MockConnectorStateManager, createMockConnectorState } from '../../../cli/src/mock-state.ts' 3 4function createManager() { 5 const data = createMockConnectorState({ token: 'test-token', npmUser: 'testuser' }) 6 return new MockConnectorStateManager(data) 7} 8 9describe('MockConnectorStateManager: executeOperations', () => { 10 let manager: MockConnectorStateManager 11 12 beforeEach(() => { 13 manager = createManager() 14 manager.connect('test-token') 15 }) 16 17 it('returns authFailure when a configured result has authFailure', () => { 18 const op = manager.addOperation({ 19 type: 'org:add-user', 20 params: { org: 'myorg', user: 'alice', role: 'developer' }, 21 description: 'Add alice', 22 command: 'npm org set myorg alice developer', 23 }) 24 manager.approveOperation(op.id) 25 26 const result = manager.executeOperations({ 27 results: { 28 [op.id]: { 29 exitCode: 1, 30 stderr: 'auth failure', 31 authFailure: true, 32 }, 33 }, 34 }) 35 36 expect(result.authFailure).toBe(true) 37 expect(result.results).toHaveLength(1) 38 expect(result.results[0]!.result.authFailure).toBe(true) 39 }) 40 41 it('returns authFailure as undefined when no operations have auth failures', () => { 42 const op = manager.addOperation({ 43 type: 'org:add-user', 44 params: { org: 'myorg', user: 'alice', role: 'developer' }, 45 description: 'Add alice', 46 command: 'npm org set myorg alice developer', 47 }) 48 manager.approveOperation(op.id) 49 50 const result = manager.executeOperations() 51 52 // Default success path -- no auth failure 53 expect(result.authFailure).toBeFalsy() 54 }) 55 56 it('collects and deduplicates urls from operation results', () => { 57 const op1 = manager.addOperation({ 58 type: 'org:add-user', 59 params: { org: 'myorg', user: 'alice', role: 'developer' }, 60 description: 'Add alice', 61 command: 'npm org set myorg alice developer', 62 }) 63 const op2 = manager.addOperation({ 64 type: 'org:add-user', 65 params: { org: 'myorg', user: 'bob', role: 'developer' }, 66 description: 'Add bob', 67 command: 'npm org set myorg bob developer', 68 }) 69 manager.approveOperation(op1.id) 70 manager.approveOperation(op2.id) 71 72 const result = manager.executeOperations({ 73 results: { 74 [op1.id]: { 75 exitCode: 0, 76 stdout: 'ok', 77 urls: ['https://npmjs.com/auth/abc'], 78 }, 79 [op2.id]: { 80 exitCode: 0, 81 stdout: 'ok', 82 urls: ['https://npmjs.com/auth/abc', 'https://npmjs.com/auth/def'], 83 }, 84 }, 85 }) 86 87 expect(result.urls).toBeDefined() 88 // Should be deduplicated 89 expect(result.urls).toEqual(['https://npmjs.com/auth/abc', 'https://npmjs.com/auth/def']) 90 }) 91 92 it('returns urls as undefined when no operations have urls', () => { 93 const op = manager.addOperation({ 94 type: 'org:add-user', 95 params: { org: 'myorg', user: 'alice', role: 'developer' }, 96 description: 'Add alice', 97 command: 'npm org set myorg alice developer', 98 }) 99 manager.approveOperation(op.id) 100 101 const result = manager.executeOperations() 102 103 expect(result.urls).toBeUndefined() 104 }) 105 106 it('returns otpRequired when a configured result requires OTP and none provided', () => { 107 const op = manager.addOperation({ 108 type: 'org:add-user', 109 params: { org: 'myorg', user: 'alice', role: 'developer' }, 110 description: 'Add alice', 111 command: 'npm org set myorg alice developer', 112 }) 113 manager.approveOperation(op.id) 114 115 const result = manager.executeOperations({ 116 results: { 117 [op.id]: { 118 exitCode: 1, 119 stderr: 'otp required', 120 requiresOtp: true, 121 }, 122 }, 123 }) 124 125 expect(result.otpRequired).toBe(true) 126 }) 127 128 it('returns both authFailure and urls together', () => { 129 const op1 = manager.addOperation({ 130 type: 'org:add-user', 131 params: { org: 'myorg', user: 'alice', role: 'developer' }, 132 description: 'Add alice', 133 command: 'npm org set myorg alice developer', 134 }) 135 const op2 = manager.addOperation({ 136 type: 'org:add-user', 137 params: { org: 'myorg', user: 'bob', role: 'developer' }, 138 description: 'Add bob', 139 command: 'npm org set myorg bob developer', 140 }) 141 manager.approveOperation(op1.id) 142 manager.approveOperation(op2.id) 143 144 const result = manager.executeOperations({ 145 results: { 146 [op1.id]: { 147 exitCode: 1, 148 stderr: 'auth failure', 149 authFailure: true, 150 urls: ['https://npmjs.com/login'], 151 }, 152 [op2.id]: { 153 exitCode: 0, 154 stdout: 'ok', 155 }, 156 }, 157 }) 158 159 expect(result.authFailure).toBe(true) 160 expect(result.urls).toEqual(['https://npmjs.com/login']) 161 }) 162})