feat(places): phone, e-mail and opening hours by hand when the search has none (#2472, #2356)

This commit is contained in:
Maurice
2026-10-01 13:42:44 +02:00
parent 8c37597bd7
commit d61d8ca9d7
45 changed files with 726 additions and 22 deletions
@@ -254,6 +254,35 @@ describe('Tool: update_place', () => {
});
});
it('takes an e-mail and structured opening hours, and null clears the hours (#2472)', async () => {
const { user } = createUser(testDb);
const trip = createTrip(testDb, user.id);
const place = createPlace(testDb, trip.id, { name: 'Bakery' });
const hours = [{ closed: false, open: '08:00', close: '18:00' }, ...Array.from({ length: 6 }, () => ({ closed: true }))];
await withHarness(user.id, async (h) => {
const data = parseToolResult(await h.client.callTool({
name: 'update_place',
arguments: { tripId: trip.id, placeId: place.id, email: 'hi@bakery.test', opening_hours: hours },
})) as any;
expect(data.place.email).toBe('hi@bakery.test');
expect(JSON.parse(data.place.opening_hours)).toEqual(hours);
const cleared = parseToolResult(await h.client.callTool({
name: 'update_place',
arguments: { tripId: trip.id, placeId: place.id, opening_hours: null },
})) as any;
expect(cleared.place.opening_hours).toBeNull();
expect(cleared.place.email).toBe('hi@bakery.test');
const bad = await h.client.callTool({
name: 'update_place',
arguments: { tripId: trip.id, placeId: place.id, email: 'not-an-address' },
});
expect(bad.isError).toBe(true);
});
});
it('moving a place drops the country Atlas cached for it, renaming it does not (#2527)', async () => {
const { user } = createUser(testDb);
const trip = createTrip(testDb, user.id);
@@ -299,6 +299,23 @@ describe('update', () => {
expect(updated.lng).toBe(2.3);
});
it('PLACE-SVC-2472 — keeps an e-mail and hand-kept hours, trims the address, empty clears', async () => {
const { user } = createUser(testDb);
const trip = createTrip(testDb, user.id);
const week = '[{"closed":false,"open":"09:00","close":"17:00"},{"closed":false},{"closed":false},{"closed":false},{"closed":false},{"closed":true},{"closed":true}]';
const place = svc.create(String(trip.id), { name: 'Bakery', email: ' shop@example.com ', opening_hours: week }) as any;
expect(place.email).toBe('shop@example.com');
expect(place.opening_hours).toBe(week);
const renamed = await svc.update(String(trip.id), String(place.id), { name: 'Baker' }) as any;
expect(renamed.email).toBe('shop@example.com');
expect(renamed.opening_hours).toBe(week);
const cleared = await svc.update(String(trip.id), String(place.id), { email: '', opening_hours: '' }) as any;
expect(cleared.email).toBeNull();
expect(cleared.opening_hours).toBeNull();
});
it('PLACE-SVC-014 — returns null for non-existent place', async () => {
const { user } = createUser(testDb);
const trip = createTrip(testDb, user.id);