forked from
npmx.dev/npmx.dev
[READ-ONLY]
a fast, modern browser for the npm registry
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})