You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
5.9 KiB
162 lines
5.9 KiB
import {getStatEndpointUrl, getToken} from '../../../src/utils/stats-config';
|
|
import {StatsConfig} from '../../../src/providers/FrameworkProvider';
|
|
import {getTinybirdToken} from '../../../src/api/tinybird';
|
|
|
|
// Mock getTinybirdToken
|
|
vi.mock('../../../src/api/tinybird', () => ({
|
|
getTinybirdToken: vi.fn()
|
|
}));
|
|
|
|
describe('stats-config utils', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
describe('getStatEndpointUrl', () => {
|
|
it('returns empty string when config is null', () => {
|
|
expect(getStatEndpointUrl(null, 'endpoint')).toBe('');
|
|
});
|
|
|
|
it('returns empty string when config is undefined', () => {
|
|
expect(getStatEndpointUrl(undefined, 'endpoint')).toBe('');
|
|
});
|
|
|
|
it('constructs URL with production endpoint when local is disabled', () => {
|
|
const config: StatsConfig = {
|
|
endpoint: 'https://api.example.com',
|
|
token: 'prod-token'
|
|
};
|
|
expect(getStatEndpointUrl(config, 'analytics')).toBe('https://api.example.com/v0/pipes/analytics.json?');
|
|
});
|
|
|
|
it('constructs URL with local endpoint when local is enabled', () => {
|
|
const config: StatsConfig = {
|
|
endpoint: 'https://api.example.com',
|
|
token: 'prod-token',
|
|
local: {
|
|
enabled: true,
|
|
endpoint: 'http://localhost:8000',
|
|
token: 'local-token'
|
|
}
|
|
};
|
|
expect(getStatEndpointUrl(config, 'analytics')).toBe('http://localhost:8000/v0/pipes/analytics.json?');
|
|
});
|
|
|
|
it('handles missing endpoint gracefully', () => {
|
|
const config: StatsConfig = {
|
|
token: 'token'
|
|
};
|
|
expect(getStatEndpointUrl(config, 'analytics')).toBe('/v0/pipes/analytics.json?');
|
|
});
|
|
|
|
it('handles missing local endpoint when local is enabled', () => {
|
|
const config: StatsConfig = {
|
|
endpoint: 'https://api.example.com',
|
|
local: {
|
|
enabled: true
|
|
}
|
|
};
|
|
expect(getStatEndpointUrl(config, 'analytics')).toBe('/v0/pipes/analytics.json?');
|
|
});
|
|
|
|
it('appends custom parameters', () => {
|
|
const config: StatsConfig = {
|
|
endpoint: 'https://api.example.com'
|
|
};
|
|
expect(getStatEndpointUrl(config, 'analytics', 'foo=bar&baz=qux')).toBe('https://api.example.com/v0/pipes/analytics.json?foo=bar&baz=qux');
|
|
});
|
|
|
|
it('handles undefined endpoint parameter', () => {
|
|
const config: StatsConfig = {
|
|
endpoint: 'https://api.example.com'
|
|
};
|
|
expect(getStatEndpointUrl(config, undefined)).toBe('https://api.example.com/v0/pipes/undefined.json?');
|
|
});
|
|
|
|
it('handles empty endpoint parameter', () => {
|
|
const config: StatsConfig = {
|
|
endpoint: 'https://api.example.com'
|
|
};
|
|
expect(getStatEndpointUrl(config, '')).toBe('https://api.example.com/v0/pipes/.json?');
|
|
});
|
|
|
|
it('prefers local config when enabled even if local endpoint is missing', () => {
|
|
const config: StatsConfig = {
|
|
endpoint: 'https://api.example.com',
|
|
local: {
|
|
enabled: true,
|
|
endpoint: ''
|
|
}
|
|
};
|
|
expect(getStatEndpointUrl(config, 'analytics')).toBe('/v0/pipes/analytics.json?');
|
|
});
|
|
|
|
it('handles local.enabled being false explicitly', () => {
|
|
const config: StatsConfig = {
|
|
endpoint: 'https://api.example.com',
|
|
local: {
|
|
enabled: false,
|
|
endpoint: 'http://localhost:8000'
|
|
}
|
|
};
|
|
expect(getStatEndpointUrl(config, 'analytics')).toBe('https://api.example.com/v0/pipes/analytics.json?');
|
|
});
|
|
|
|
it('prefers endpointBrowser over endpoint when both are present', () => {
|
|
const config: StatsConfig = {
|
|
endpoint: 'https://api.example.com',
|
|
endpointBrowser: 'https://browser-api.example.com'
|
|
};
|
|
expect(getStatEndpointUrl(config, 'analytics')).toBe('https://browser-api.example.com/v0/pipes/analytics.json?');
|
|
});
|
|
});
|
|
|
|
describe('getToken', () => {
|
|
const mockTokenFromApi: string = 'api-fetched-token';
|
|
|
|
it('returns token from getTinybirdToken when it returns a valid token', () => {
|
|
vi.mocked(getTinybirdToken).mockReturnValue({
|
|
data: {tinybird: {token: mockTokenFromApi}},
|
|
refetch: vi.fn()
|
|
} as any);
|
|
|
|
expect(getToken()).toBe(mockTokenFromApi);
|
|
});
|
|
|
|
it('returns undefined when getTinybirdToken returns null token', () => {
|
|
vi.mocked(getTinybirdToken).mockReturnValue({
|
|
data: {tinybird: {token: null}},
|
|
refetch: vi.fn()
|
|
} as any);
|
|
|
|
expect(getToken()).toBeUndefined();
|
|
});
|
|
|
|
it('returns undefined when getTinybirdToken returns undefined token', () => {
|
|
vi.mocked(getTinybirdToken).mockReturnValue({
|
|
data: {tinybird: {token: undefined}},
|
|
refetch: vi.fn()
|
|
} as any);
|
|
|
|
expect(getToken()).toBeUndefined();
|
|
});
|
|
|
|
it('returns undefined when getTinybirdToken returns non-string token', () => {
|
|
vi.mocked(getTinybirdToken).mockReturnValue({
|
|
data: {tinybird: {token: 123}},
|
|
refetch: vi.fn()
|
|
} as any);
|
|
|
|
expect(getToken()).toBeUndefined();
|
|
});
|
|
|
|
it('returns undefined when getTinybirdToken returns no data', () => {
|
|
vi.mocked(getTinybirdToken).mockReturnValue({
|
|
data: undefined,
|
|
refetch: vi.fn()
|
|
} as any);
|
|
|
|
expect(getToken()).toBeUndefined();
|
|
});
|
|
});
|
|
});
|