chore: apply requested changes
This commit is contained in:
@@ -290,12 +290,14 @@ describe('CredentialStore', () => {
|
||||
savedAt: new Date().toISOString()
|
||||
};
|
||||
|
||||
expect(() => store.saveCredentials(credentials)).toThrow(
|
||||
AuthenticationError
|
||||
);
|
||||
expect(() => store.saveCredentials(credentials)).toThrow(
|
||||
'Invalid expiresAt format'
|
||||
);
|
||||
let err: unknown;
|
||||
try {
|
||||
store.saveCredentials(credentials);
|
||||
} catch (e) {
|
||||
err = e;
|
||||
}
|
||||
expect(err).toBeInstanceOf(AuthenticationError);
|
||||
expect((err as Error).message).toContain('Invalid expiresAt format');
|
||||
});
|
||||
|
||||
it('should reject NaN timestamp when saving', () => {
|
||||
@@ -307,12 +309,14 @@ describe('CredentialStore', () => {
|
||||
savedAt: new Date().toISOString()
|
||||
};
|
||||
|
||||
expect(() => store.saveCredentials(credentials)).toThrow(
|
||||
AuthenticationError
|
||||
);
|
||||
expect(() => store.saveCredentials(credentials)).toThrow(
|
||||
'Invalid expiresAt format'
|
||||
);
|
||||
let err: unknown;
|
||||
try {
|
||||
store.saveCredentials(credentials);
|
||||
} catch (e) {
|
||||
err = e;
|
||||
}
|
||||
expect(err).toBeInstanceOf(AuthenticationError);
|
||||
expect((err as Error).message).toContain('Invalid expiresAt format');
|
||||
});
|
||||
|
||||
it('should reject Infinity timestamp when saving', () => {
|
||||
@@ -324,12 +328,14 @@ describe('CredentialStore', () => {
|
||||
savedAt: new Date().toISOString()
|
||||
};
|
||||
|
||||
expect(() => store.saveCredentials(credentials)).toThrow(
|
||||
AuthenticationError
|
||||
);
|
||||
expect(() => store.saveCredentials(credentials)).toThrow(
|
||||
'Invalid expiresAt format'
|
||||
);
|
||||
let err: unknown;
|
||||
try {
|
||||
store.saveCredentials(credentials);
|
||||
} catch (e) {
|
||||
err = e;
|
||||
}
|
||||
expect(err).toBeInstanceOf(AuthenticationError);
|
||||
expect((err as Error).message).toContain('Invalid expiresAt format');
|
||||
});
|
||||
|
||||
it('should handle missing expiresAt when saving', () => {
|
||||
@@ -403,6 +409,124 @@ describe('CredentialStore', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('clearCredentials', () => {
|
||||
it('should delete the auth file when it exists', () => {
|
||||
// Mock file exists
|
||||
vi.mocked(fs.existsSync).mockReturnValue(true);
|
||||
vi.mocked(fs.unlinkSync).mockImplementation(() => undefined);
|
||||
|
||||
store.clearCredentials();
|
||||
|
||||
expect(fs.existsSync).toHaveBeenCalledWith('/test/config/auth.json');
|
||||
expect(fs.unlinkSync).toHaveBeenCalledWith('/test/config/auth.json');
|
||||
});
|
||||
|
||||
it('should not throw when auth file does not exist', () => {
|
||||
// Mock file does not exist
|
||||
vi.mocked(fs.existsSync).mockReturnValue(false);
|
||||
|
||||
// Should not throw
|
||||
expect(() => store.clearCredentials()).not.toThrow();
|
||||
|
||||
// Should not try to unlink non-existent file
|
||||
expect(fs.unlinkSync).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should throw AuthenticationError when unlink fails', () => {
|
||||
vi.mocked(fs.existsSync).mockReturnValue(true);
|
||||
vi.mocked(fs.unlinkSync).mockImplementation(() => {
|
||||
throw new Error('Permission denied');
|
||||
});
|
||||
|
||||
let err: unknown;
|
||||
try {
|
||||
store.clearCredentials();
|
||||
} catch (e) {
|
||||
err = e;
|
||||
}
|
||||
|
||||
expect(err).toBeInstanceOf(AuthenticationError);
|
||||
expect((err as Error).message).toContain('Failed to clear credentials');
|
||||
expect((err as Error).message).toContain('Permission denied');
|
||||
});
|
||||
});
|
||||
|
||||
describe('hasValidCredentials', () => {
|
||||
it('should return true when valid unexpired credentials exist', () => {
|
||||
const futureDate = new Date(Date.now() + 3600000); // 1 hour from now
|
||||
const credentials = {
|
||||
token: 'valid-token',
|
||||
userId: 'user-123',
|
||||
expiresAt: futureDate.toISOString(),
|
||||
tokenType: 'standard',
|
||||
savedAt: new Date().toISOString()
|
||||
};
|
||||
|
||||
vi.mocked(fs.existsSync).mockReturnValue(true);
|
||||
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(credentials));
|
||||
|
||||
expect(store.hasValidCredentials()).toBe(true);
|
||||
});
|
||||
|
||||
it('should return false when credentials are expired', () => {
|
||||
const pastDate = new Date(Date.now() - 3600000); // 1 hour ago
|
||||
const credentials = {
|
||||
token: 'expired-token',
|
||||
userId: 'user-123',
|
||||
expiresAt: pastDate.toISOString(),
|
||||
tokenType: 'standard',
|
||||
savedAt: new Date().toISOString()
|
||||
};
|
||||
|
||||
vi.mocked(fs.existsSync).mockReturnValue(true);
|
||||
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(credentials));
|
||||
|
||||
expect(store.hasValidCredentials()).toBe(false);
|
||||
});
|
||||
|
||||
it('should return false when no credentials exist', () => {
|
||||
vi.mocked(fs.existsSync).mockReturnValue(false);
|
||||
|
||||
expect(store.hasValidCredentials()).toBe(false);
|
||||
});
|
||||
|
||||
it('should return false when file contains invalid JSON', () => {
|
||||
vi.mocked(fs.existsSync).mockReturnValue(true);
|
||||
vi.mocked(fs.readFileSync).mockReturnValue('invalid json {');
|
||||
vi.mocked(fs.renameSync).mockImplementation(() => undefined);
|
||||
|
||||
expect(store.hasValidCredentials()).toBe(false);
|
||||
});
|
||||
|
||||
it('should return false for credentials without expiry', () => {
|
||||
const credentials = {
|
||||
token: 'no-expiry-token',
|
||||
userId: 'user-123',
|
||||
tokenType: 'standard',
|
||||
savedAt: new Date().toISOString()
|
||||
};
|
||||
|
||||
vi.mocked(fs.existsSync).mockReturnValue(true);
|
||||
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(credentials));
|
||||
|
||||
// Credentials without expiry are considered invalid
|
||||
expect(store.hasValidCredentials()).toBe(false);
|
||||
|
||||
// Should log warning about missing expiration
|
||||
expect(mockLogger.warn).toHaveBeenCalledWith('No valid expiration time provided for token');
|
||||
});
|
||||
|
||||
it('should use allowExpired=false by default', () => {
|
||||
// Spy on getCredentials to verify it's called with correct params
|
||||
const getCredentialsSpy = vi.spyOn(store, 'getCredentials');
|
||||
|
||||
vi.mocked(fs.existsSync).mockReturnValue(false);
|
||||
store.hasValidCredentials();
|
||||
|
||||
expect(getCredentialsSpy).toHaveBeenCalledWith({ allowExpired: false });
|
||||
});
|
||||
});
|
||||
|
||||
describe('cleanupCorruptFiles', () => {
|
||||
it('should remove old corrupt files', () => {
|
||||
const now = Date.now();
|
||||
|
||||
Reference in New Issue
Block a user