Skip to content

Commit d2f6072

Browse files
committed
test: login & logout
1 parent 5e66eb2 commit d2f6072

File tree

2 files changed

+55
-45
lines changed

2 files changed

+55
-45
lines changed

src/commands/auth.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,10 @@ export async function login() {
9797
* @returns void
9898
*/
9999
export async function logout() {
100-
const spinner = ora('Logging out from Puter...').start();
101100

101+
let spinner;
102102
try {
103+
spinner = ora('Logging out from Puter...').start();
103104
const token = config.get('auth_token');
104105
if (!token) {
105106
spinner.info(chalk.yellow('Already logged out'));
@@ -109,7 +110,9 @@ export async function logout() {
109110
config.clear(); // Remove all stored data
110111
spinner.succeed(chalk.green('Successfully logged out from Puter!'));
111112
} catch (error) {
112-
spinner.fail(chalk.red('Failed to logout'));
113+
if (spinner){
114+
spinner.fail(chalk.red('Failed to logout'));
115+
}
113116
console.error(chalk.red(`Error: ${error.message}`));
114117
}
115118
}

tests/login.test.js

Lines changed: 50 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import ora from 'ora';
66
import chalk from 'chalk';
77
import fetch from 'node-fetch';
88
import Conf from 'conf';
9-
import { BASE_URL } from '../src/commons.js';
9+
import { BASE_URL, PROJECT_NAME } from '../src/commons.js';
1010

1111
// Mock console to prevent actual logging
1212
vi.spyOn(console, 'log').mockImplementation(() => {});
@@ -18,37 +18,43 @@ vi.mock('chalk', () => ({
1818
default: {
1919
green: vi.fn(text => text),
2020
red: vi.fn(text => text),
21-
dim: vi.fn(text => text)
21+
dim: vi.fn(text => text),
22+
yellow: vi.fn(text => text),
23+
cyan: vi.fn(text => text),
2224
}
2325
}));
2426
vi.mock('node-fetch');
2527

26-
// Mock Conf
27-
vi.mock('conf', () => {
28-
return {
29-
default: vi.fn().mockImplementation(() => ({
30-
set: vi.fn(),
31-
get: vi.fn(),
32-
}))
33-
}
34-
});
35-
3628
// Create a mock spinner object
3729
const mockSpinner = {
3830
start: vi.fn().mockReturnThis(),
3931
succeed: vi.fn().mockReturnThis(),
40-
fail: vi.fn().mockReturnThis()
32+
fail: vi.fn().mockReturnThis(),
33+
info: vi.fn().mockReturnThis(),
4134
};
4235

4336
// Mock ora
4437
vi.mock('ora', () => ({
4538
default: vi.fn(() => mockSpinner)
4639
}));
4740

41+
// Mock Conf
42+
vi.mock('conf', () => {
43+
return {
44+
default: vi.fn().mockImplementation(() => ({
45+
set: vi.fn(),
46+
get: vi.fn(),
47+
clear: vi.fn(),
48+
})),
49+
};
50+
});
4851

4952
describe('auth.js', () => {
53+
// let config;
54+
5055
beforeEach(() => {
5156
vi.clearAllMocks();
57+
// config = new Conf({ projectName: PROJECT_NAME });
5258
});
5359

5460
describe('login', () => {
@@ -85,69 +91,69 @@ describe('auth.js', () => {
8591
// Verify spinner methods were called
8692
expect(mockSpinner.start).toHaveBeenCalled();
8793
expect(mockSpinner.succeed).toHaveBeenCalled();
88-
8994
});
90-
/*
95+
9196
it('should fail login with invalid credentials', async () => {
9297
inquirer.prompt.mockResolvedValue({ username: 'testuser', password: 'testpass' });
9398
fetch.mockResolvedValue({
9499
json: vi.fn().mockResolvedValue({ proceed: false }),
95100
ok: true,
96101
});
97-
const spinner = { start: vi.fn(), fail: vi.fn() };
98-
ora.mockReturnValue(spinner);
99102

100103
await login();
101-
102-
expect(spinner.fail).toHaveBeenCalledWith(chalk.red('Login failed. Please check your credentials.'));
104+
expect(mockSpinner.fail).toHaveBeenCalledWith(chalk.red('Login failed. Please check your credentials.'));
103105
});
104106

105107
it('should handle login error', async () => {
106108
inquirer.prompt.mockResolvedValue({ username: 'testuser', password: 'testpass' });
107109
fetch.mockRejectedValue(new Error('Network error'));
108-
const spinner = { start: vi.fn(), fail: vi.fn() };
109-
ora.mockReturnValue(spinner);
110-
111-
await login();
112110

113-
expect(spinner.fail).toHaveBeenCalledWith(chalk.red('Failed to login'));
114-
});*/
111+
await expect(login()).rejects.toThrow('Network error');
112+
expect(mockSpinner.fail).toHaveBeenCalledWith(chalk.red('Failed to login'));
113+
expect(console.error).toHaveBeenCalledWith(chalk.red('Error: Network error'));
114+
});
115115
});
116-
/*
116+
117+
117118
describe('logout', () => {
118-
it('should logout successfully', async () => {
119-
config.get.mockReturnValue('testtoken');
120-
const spinner = { start: vi.fn(), succeed: vi.fn() };
121-
ora.mockReturnValue(spinner);
119+
let config;
122120

123-
await logout();
121+
beforeEach(() => {
122+
vi.clearAllMocks();
123+
config = new Conf({ projectName: PROJECT_NAME });
124+
// config.clear = vi.fn();
125+
});
124126

127+
it.skip('should logout successfully', async () => {
128+
// Mock config.get to return a token
129+
config.get = vi.fn().mockReturnValue('testtoken');
130+
await logout();
131+
// Verify config.clear was called
125132
expect(config.clear).toHaveBeenCalled();
126-
expect(spinner.succeed).toHaveBeenCalledWith(chalk.green('Successfully logged out from Puter!'));
133+
expect(mockSpinner.succeed).toHaveBeenCalledWith(chalk.green('Successfully logged out from Puter!'));
127134
});
128135

129136
it('should handle already logged out', async () => {
130-
config.get.mockReturnValue(null);
131-
const spinner = { start: vi.fn(), info: vi.fn() };
132-
ora.mockReturnValue(spinner);
137+
config.get = vi.fn().mockReturnValue(null);
133138

134139
await logout();
135140

136-
expect(spinner.info).toHaveBeenCalledWith(chalk.yellow('Already logged out'));
141+
expect(mockSpinner.info).toHaveBeenCalledWith(chalk.yellow('Already logged out'));
137142
});
138143

139-
it('should handle logout error', async () => {
140-
config.get.mockReturnValue('testtoken');
141-
config.clear.mockImplementation(() => { throw new Error('Config error'); });
142-
const spinner = { start: vi.fn(), fail: vi.fn() };
143-
ora.mockReturnValue(spinner);
144+
it.skip('should handle logout error', async () => {
145+
config.get = vi.fn().mockReturnValue('testtoken');
146+
config.clear = vi.fn().mockImplementation(() => { throw new Error('Config error'); });
144147

145148
await logout();
146149

147-
expect(spinner.fail).toHaveBeenCalledWith(chalk.red('Failed to logout'));
150+
expect(mockSpinner.fail).toHaveBeenCalled();
151+
expect(mockSpinner.fail).toHaveBeenCalledWith(chalk.red('Failed to logout'));
148152
});
153+
149154
});
150-
155+
156+
/*
151157
describe('getUserInfo', () => {
152158
it('should fetch user info successfully', async () => {
153159
fetch.mockResolvedValue({
@@ -265,4 +271,5 @@ describe('auth.js', () => {
265271
});
266272
});
267273
*/
274+
268275
});

0 commit comments

Comments
 (0)