mirror of
https://github.com/bulwarkmail/native.git
synced 2026-11-01 16:05:39 +00:00
60 lines
2.2 KiB
TypeScript
60 lines
2.2 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { describeLoginError } from '../login-errors';
|
|
|
|
function named(name: string, message: string): Error {
|
|
const err = new Error(message);
|
|
err.name = name;
|
|
return err;
|
|
}
|
|
|
|
describe('describeLoginError', () => {
|
|
it('turns a rejected credential into an actionable message', () => {
|
|
const copy = describeLoginError(named('AuthenticationError', 'Invalid credentials'));
|
|
expect(copy.title).toBe("That didn't work");
|
|
expect(copy.detail).toMatch(/app password/i);
|
|
});
|
|
|
|
it('names the host it could not reach', () => {
|
|
const copy = describeLoginError(named('NetworkError', 'Network request failed'), {
|
|
serverUrl: 'https://mail.example.com',
|
|
});
|
|
expect(copy.title).toBe("Can't reach mail.example.com");
|
|
});
|
|
|
|
it('falls back to a generic host label when the server is unknown', () => {
|
|
const copy = describeLoginError(named('TypeError', 'Network request failed'));
|
|
expect(copy.title).toBe("Can't reach the server");
|
|
});
|
|
|
|
it('explains a 404 from session discovery as a wrong address', () => {
|
|
const copy = describeLoginError(new Error('Session discovery failed: 404 Not Found'), {
|
|
serverUrl: 'https://example.com',
|
|
});
|
|
expect(copy.title).toBe('No mail server at example.com');
|
|
});
|
|
|
|
it('flags a certificate problem separately from a connection problem', () => {
|
|
const copy = describeLoginError(new Error('SSL certificate has expired'), {
|
|
serverUrl: 'https://mail.example.com',
|
|
});
|
|
expect(copy.title).toBe("Couldn't verify mail.example.com");
|
|
});
|
|
|
|
it('explains an expired pairing code', () => {
|
|
const copy = describeLoginError(new Error('Pairing code is invalid or has expired'));
|
|
expect(copy.title).toBe('That code has expired');
|
|
expect(copy.detail).toMatch(/fresh one/i);
|
|
});
|
|
|
|
it('passes through an unrecognised message rather than inventing a cause', () => {
|
|
const copy = describeLoginError(new Error('Teapot refused to brew'));
|
|
expect(copy.title).toBe('Sign-in failed');
|
|
expect(copy.detail).toBe('Teapot refused to brew');
|
|
});
|
|
|
|
it('handles non-Error throws', () => {
|
|
expect(describeLoginError(undefined).title).toBe('Sign-in failed');
|
|
expect(describeLoginError('boom').detail).toBe('boom');
|
|
});
|
|
});
|