Restructure with Turborepo
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
import { parseOsmOpeningHours } from '../../API/opening-hours-osm.js';
|
||||
|
||||
describe('parseOsmOpeningHours', () => {
|
||||
test('returns null for empty / non-string input', () => {
|
||||
expect(parseOsmOpeningHours('')).toBeNull();
|
||||
expect(parseOsmOpeningHours(null)).toBeNull();
|
||||
expect(parseOsmOpeningHours(undefined)).toBeNull();
|
||||
expect(parseOsmOpeningHours(123)).toBeNull();
|
||||
});
|
||||
|
||||
test('24/7 → every day 00:00–24:00', () => {
|
||||
expect(parseOsmOpeningHours('24/7')).toEqual({
|
||||
mon: ['00:00', '24:00'],
|
||||
tue: ['00:00', '24:00'],
|
||||
wed: ['00:00', '24:00'],
|
||||
thu: ['00:00', '24:00'],
|
||||
fri: ['00:00', '24:00'],
|
||||
sat: ['00:00', '24:00'],
|
||||
sun: ['00:00', '24:00'],
|
||||
});
|
||||
});
|
||||
|
||||
test('Mo-Fr 09:00-21:00 → weekdays set, weekend null', () => {
|
||||
const result = parseOsmOpeningHours('Mo-Fr 09:00-21:00');
|
||||
expect(result.mon).toEqual(['09:00', '21:00']);
|
||||
expect(result.fri).toEqual(['09:00', '21:00']);
|
||||
expect(result.sat).toBeNull();
|
||||
expect(result.sun).toBeNull();
|
||||
});
|
||||
|
||||
test('Multiple rules separated by semicolons', () => {
|
||||
const result = parseOsmOpeningHours('Mo-Fr 09:00-21:00; Sa 09:00-14:00; Su closed');
|
||||
expect(result.mon).toEqual(['09:00', '21:00']);
|
||||
expect(result.fri).toEqual(['09:00', '21:00']);
|
||||
expect(result.sat).toEqual(['09:00', '14:00']);
|
||||
expect(result.sun).toBeNull();
|
||||
});
|
||||
|
||||
test('Comma-separated day list', () => {
|
||||
const result = parseOsmOpeningHours('Mo,We,Fr 10:00-14:00');
|
||||
expect(result.mon).toEqual(['10:00', '14:00']);
|
||||
expect(result.tue).toBeNull();
|
||||
expect(result.wed).toEqual(['10:00', '14:00']);
|
||||
expect(result.thu).toBeNull();
|
||||
expect(result.fri).toEqual(['10:00', '14:00']);
|
||||
});
|
||||
|
||||
test('Split shifts collapsed to first-open / last-close', () => {
|
||||
const result = parseOsmOpeningHours('Mo-Fr 09:00-13:30,16:30-20:00');
|
||||
expect(result.mon).toEqual(['09:00', '20:00']);
|
||||
expect(result.fri).toEqual(['09:00', '20:00']);
|
||||
});
|
||||
|
||||
test('Wrap-around day range Sa-Mo', () => {
|
||||
const result = parseOsmOpeningHours('Sa-Mo 10:00-18:00');
|
||||
expect(result.sat).toEqual(['10:00', '18:00']);
|
||||
expect(result.sun).toEqual(['10:00', '18:00']);
|
||||
expect(result.mon).toEqual(['10:00', '18:00']);
|
||||
expect(result.tue).toBeNull();
|
||||
});
|
||||
|
||||
test('Public-holiday rules are ignored', () => {
|
||||
const result = parseOsmOpeningHours('Mo-Fr 09:00-21:00; PH off');
|
||||
expect(result.mon).toEqual(['09:00', '21:00']);
|
||||
});
|
||||
|
||||
test('Parenthetical comments are stripped', () => {
|
||||
const result = parseOsmOpeningHours('Mo-Fr 09:00-14:00 (verano)');
|
||||
expect(result.mon).toEqual(['09:00', '14:00']);
|
||||
});
|
||||
|
||||
test('"off" applies null to those days', () => {
|
||||
const result = parseOsmOpeningHours('Mo-Fr 09:00-21:00; Sa off');
|
||||
expect(result.sat).toBeNull();
|
||||
expect(result.mon).toEqual(['09:00', '21:00']);
|
||||
});
|
||||
|
||||
test('Returns null when nothing parses', () => {
|
||||
expect(parseOsmOpeningHours('see website')).toBeNull();
|
||||
expect(parseOsmOpeningHours('?')).toBeNull();
|
||||
});
|
||||
|
||||
test('Single-digit hours get zero-padded', () => {
|
||||
const result = parseOsmOpeningHours('Mo 9:00-18:00');
|
||||
expect(result.mon).toEqual(['09:00', '18:00']);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,80 @@
|
||||
import { jest } from '@jest/globals'
|
||||
|
||||
jest.unstable_mockModule('../cima-service.js', () => ({
|
||||
searchMedicines: jest.fn(async () => []),
|
||||
getMedicineDetails: jest.fn(async () => null),
|
||||
}))
|
||||
|
||||
jest.unstable_mockModule('../farmacias-webhook-import.js', () => ({
|
||||
runFarmaciaWebhookImport: jest.fn(async () => ({})),
|
||||
DEFAULT_FARMACIAS_WEBHOOK: '',
|
||||
importPharmaciesFromRows: jest.fn(async () => ({})),
|
||||
}))
|
||||
|
||||
jest.unstable_mockModule('../../API/index.js', () => ({
|
||||
fetchPharmaciesExternal: jest.fn(async () => []),
|
||||
}))
|
||||
|
||||
process.env.DATABASE_PATH = ':memory:'
|
||||
process.env.NODE_ENV = 'test'
|
||||
|
||||
const { default: supertest } = await import('supertest')
|
||||
const { app, initDatabase, db } = await import('../server.js')
|
||||
const { default: bcrypt } = await import('bcrypt')
|
||||
|
||||
beforeAll(async () => {
|
||||
await initDatabase()
|
||||
const hash = await bcrypt.hash('testpass', 10)
|
||||
await new Promise((resolve, reject) => {
|
||||
db.run(
|
||||
'INSERT INTO users (username, password_hash, is_admin) VALUES (?, ?, 1)',
|
||||
['testadmin', hash],
|
||||
(err) => (err ? reject(err) : resolve())
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
describe('Medicine search', () => {
|
||||
test('GET /api/medicines/search with empty q returns []', async () => {
|
||||
const res = await supertest(app).get('/api/medicines/search?q=')
|
||||
expect(res.status).toBe(200)
|
||||
expect(res.body).toEqual([])
|
||||
})
|
||||
|
||||
test('GET /api/medicines/search with short q returns array', async () => {
|
||||
const res = await supertest(app).get('/api/medicines/search?q=a')
|
||||
expect(res.status).toBe(200)
|
||||
expect(Array.isArray(res.body)).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('Authentication', () => {
|
||||
test('POST /api/auth/login with wrong creds returns 401', async () => {
|
||||
const res = await supertest(app)
|
||||
.post('/api/auth/login')
|
||||
.send({ username: 'nobody', password: 'wrong' })
|
||||
expect(res.status).toBe(401)
|
||||
})
|
||||
})
|
||||
|
||||
describe('Admin routes', () => {
|
||||
test('GET /api/admin/medicines without auth returns 401', async () => {
|
||||
const res = await supertest(app).get('/api/admin/medicines')
|
||||
expect(res.status).toBe(401)
|
||||
})
|
||||
|
||||
test('POST /api/admin/pharmacies with valid auth returns 201', async () => {
|
||||
const agent = supertest.agent(app)
|
||||
const login = await agent
|
||||
.post('/api/auth/login')
|
||||
.send({ username: 'testadmin', password: 'testpass' })
|
||||
expect(login.status).toBe(200)
|
||||
|
||||
const res = await agent.post('/api/admin/pharmacies').send({
|
||||
name: 'Test Pharmacy',
|
||||
address: 'Test Street 1',
|
||||
})
|
||||
expect(res.status).toBe(201)
|
||||
expect(res.body).toMatchObject({ name: 'Test Pharmacy', address: 'Test Street 1' })
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user