From 8c4427f06a91ad0e0c2a636b498f0cdbbe325dfe Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Mon, 29 Jul 2024 12:54:21 +0200 Subject: [PATCH 01/44] wip --- .../(user)/taxi/ConfirmationDialog.svelte | 60 +++++++++++++++++++ src/routes/(user)/taxi/TourDialog.svelte | 27 +++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/routes/(user)/taxi/ConfirmationDialog.svelte diff --git a/src/routes/(user)/taxi/ConfirmationDialog.svelte b/src/routes/(user)/taxi/ConfirmationDialog.svelte new file mode 100644 index 00000000..51a9937e --- /dev/null +++ b/src/routes/(user)/taxi/ConfirmationDialog.svelte @@ -0,0 +1,60 @@ + + +{#if showDialog} +
+
+

Are you sure?

+ + +
+{/if} + + + + diff --git a/src/routes/(user)/taxi/TourDialog.svelte b/src/routes/(user)/taxi/TourDialog.svelte index 047f7570..3ca66d81 100644 --- a/src/routes/(user)/taxi/TourDialog.svelte +++ b/src/routes/(user)/taxi/TourDialog.svelte @@ -10,6 +10,8 @@ import ArrowLeft from 'lucide-svelte/icons/arrow-left'; import ArrowRight from 'lucide-svelte/icons/arrow-right'; import type { TourDetails, Event } from './TourDetails'; + import Button from '$lib/components/ui/button/button.svelte'; + import ConfirmationDialog from './ConfirmationDialog.svelte'; class Props { open!: { @@ -62,6 +64,16 @@ const routes = $derived(open.tour && getRoutes(open.tour.events)); const center = $derived(open.tour && getCenter(open.tour.events)); + + let showConfirmationDialog = $state(false); + + function handleConfirm() { + showConfirmationDialog = false; + } + + function handleCancel() { + showConfirmationDialog = false; + } + + + + + + Are you sure absolutely sure? + + This action cannot be undone. This will permanently delete your account and remove + your data from our servers. + + + + + + {/snippet} From e3ec604a1ecd507212b2b069ef01431238e76a7d Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Tue, 13 Aug 2024 11:13:06 +0200 Subject: [PATCH 02/44] wip --- src/lib/sqlHelpers.ts | 1 - src/routes/(user)/+layout.svelte | 4 ++ src/routes/(user)/drivers/+page.server.ts | 42 ++++++++++++ src/routes/(user)/drivers/+page.svelte | 82 +++++++++++++++++++++++ 4 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 src/routes/(user)/drivers/+page.server.ts create mode 100644 src/routes/(user)/drivers/+page.svelte diff --git a/src/lib/sqlHelpers.ts b/src/lib/sqlHelpers.ts index 123c7c57..3f8276fb 100644 --- a/src/lib/sqlHelpers.ts +++ b/src/lib/sqlHelpers.ts @@ -1,5 +1,4 @@ import { db } from '$lib/database'; -import { TZ } from '$lib/constants.js'; export const queryCompletedTours = async (companyId: number | undefined) => { return await db diff --git a/src/routes/(user)/+layout.svelte b/src/routes/(user)/+layout.svelte index 2495caab..39f85645 100644 --- a/src/routes/(user)/+layout.svelte +++ b/src/routes/(user)/+layout.svelte @@ -15,6 +15,10 @@ { name: 'Abgeschlossene Fahrten', href: '/tours' + }, + { + name: 'Fahrer', + href: '/drivers' } ]; diff --git a/src/routes/(user)/drivers/+page.server.ts b/src/routes/(user)/drivers/+page.server.ts new file mode 100644 index 00000000..f83573cf --- /dev/null +++ b/src/routes/(user)/drivers/+page.server.ts @@ -0,0 +1,42 @@ +import type { Actions } from './$types'; +import { db } from '$lib/database'; +import { fail } from '@sveltejs/kit'; + +export const actions = { + default: async ({ request }) => { + const email = (await request.formData()).get('email')!.toString(); + if (!email) { + return fail(400, { email, missing: true }); + } + try { + const user = await db + .selectFrom('auth_user') + .where('email', '=', email) + .selectAll() + .executeTakeFirstOrThrow(); + if (user.is_entrepreneur) { + return { existed: true }; + } + const companyId = (await db + .insertInto('company') + .values({ + latitude: null, + longitude: null, + name: null, + address: null, + zone: null, + community_area: null + }) + .returning('company.id') + .executeTakeFirst())!.id; + await db + .updateTable('auth_user') + .set({ company_id: companyId, is_entrepreneur: true }) + .where('email', '=', email) + .executeTakeFirst(); + } catch { + return fail(400, { email, incorrect: true }); + } + return { updated: true }; + } +} satisfies Actions; diff --git a/src/routes/(user)/drivers/+page.svelte b/src/routes/(user)/drivers/+page.svelte new file mode 100644 index 00000000..8b22c5bf --- /dev/null +++ b/src/routes/(user)/drivers/+page.svelte @@ -0,0 +1,82 @@ + + +
+ {@render assignment()} + {@render drivers()} +
+ +{#snippet assignment()} + + + Fahrer freischalten + + +
+
+ +
+ +
+
+
+
+
+{/snippet} + +{#snippet drivers()} + + + Aktive Fahrer + + + + + + Name + Vorname + Fahrzeug + + + + + TODO + TODO + TODO + + + + + +{/snippet} From 50925bf9ad14f42f706f04ff3cb9f559f3af5aca Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Fri, 23 Aug 2024 16:12:41 +0200 Subject: [PATCH 03/44] add field is_driver to auth_user --- migrations/2024-08-23-1.js | 15 +++++++++++++++ src/lib/types.ts | 1 + src/routes/(user)/drivers/+page.server.ts | 17 +++-------------- 3 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 migrations/2024-08-23-1.js diff --git a/migrations/2024-08-23-1.js b/migrations/2024-08-23-1.js new file mode 100644 index 00000000..babc010e --- /dev/null +++ b/migrations/2024-08-23-1.js @@ -0,0 +1,15 @@ +export async function up(db) { + await db.schema + .alterTable('auth_user') + .addColumn('is_driver', 'boolean', (col) => + col.notNull().defaultTo(false), + ) + .execute(); +} + +export async function down(db) { + await db.schema + .alterTable('auth_user') + .dropColumn('is_driver') + .execute(); +} \ No newline at end of file diff --git a/src/lib/types.ts b/src/lib/types.ts index 565f9c5c..d9df7c10 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -97,6 +97,7 @@ export interface UserAuthTable { password_hash: string; is_entrepreneur: boolean; is_maintainer: boolean; + is_driver: boolean; first_name: string | null; last_name: string | null; phone: string | null; diff --git a/src/routes/(user)/drivers/+page.server.ts b/src/routes/(user)/drivers/+page.server.ts index f83573cf..5c744ab9 100644 --- a/src/routes/(user)/drivers/+page.server.ts +++ b/src/routes/(user)/drivers/+page.server.ts @@ -5,6 +5,7 @@ import { fail } from '@sveltejs/kit'; export const actions = { default: async ({ request }) => { const email = (await request.formData()).get('email')!.toString(); + const companyId = 0; if (!email) { return fail(400, { email, missing: true }); } @@ -14,24 +15,12 @@ export const actions = { .where('email', '=', email) .selectAll() .executeTakeFirstOrThrow(); - if (user.is_entrepreneur) { + if (user.is_driver) { return { existed: true }; } - const companyId = (await db - .insertInto('company') - .values({ - latitude: null, - longitude: null, - name: null, - address: null, - zone: null, - community_area: null - }) - .returning('company.id') - .executeTakeFirst())!.id; await db .updateTable('auth_user') - .set({ company_id: companyId, is_entrepreneur: true }) + .set({ company_id: companyId, is_driver: true }) .where('email', '=', email) .executeTakeFirst(); } catch { From 220c91754f03052c435df665527db6f4eedba5bf Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Tue, 27 Aug 2024 09:09:00 +0200 Subject: [PATCH 04/44] wip --- booking-generator/test/generator.conf | 11 + booking-generator/test/single_request.json | 26 ++ src/routes/request/+page.svelte | 278 +++++++++++++++++++++ 3 files changed, 315 insertions(+) create mode 100644 booking-generator/test/generator.conf create mode 100644 booking-generator/test/single_request.json create mode 100644 src/routes/request/+page.svelte diff --git a/booking-generator/test/generator.conf b/booking-generator/test/generator.conf new file mode 100644 index 00000000..e1f95e23 --- /dev/null +++ b/booking-generator/test/generator.conf @@ -0,0 +1,11 @@ +{ + "data": "./booking-generator/test/single_request.json", + "single_request": true, + "days": 3, + "max_passengers": 3, + "max_requests": 5, + "max_bookings": null, + "delay": 1, + "url": "http://localhost:5173/api/booking", + "auth": "or5cgzd77zodgexr6nhch3fjbl2ozybk3rw52uab" +} \ No newline at end of file diff --git a/booking-generator/test/single_request.json b/booking-generator/test/single_request.json new file mode 100644 index 00000000..40ffd349 --- /dev/null +++ b/booking-generator/test/single_request.json @@ -0,0 +1,26 @@ +{ + "from": { + "coordinates": { "lat": 51.18205293877134, "lng": 14.862986488474997 }, + "address": { + "street": "", + "house_number": "", + "city": "", + "postal_code": "" + } + }, + "to": { + "coordinates": { "lat": 51.14937071095368, "lng": 14.93582906557364 }, + "address": { + "street": "", + "house_number": "", + "city": "", + "postal_code": "" + } + }, + "startFixed": true, + "timeStamp": "2024-08-16T14:00:00Z", + "numPassengers": 2, + "numWheelchairs": 0, + "numBikes": 0, + "luggage": 0 +} diff --git a/src/routes/request/+page.svelte b/src/routes/request/+page.svelte new file mode 100644 index 00000000..3e1f9f0a --- /dev/null +++ b/src/routes/request/+page.svelte @@ -0,0 +1,278 @@ + + + { + if (url.startsWith('/')) { + return { url: `https://europe.motis-project.de/tiles${url}` }; + } + }} + center={[14.679165796358308, 51.32815838241428]} + {zoom} + style={getStyle(0)} + className="h-screen w-screen h-full w-full rounded-lg border shadow" +> + + +
+
+ +
+ + + + +
+
+ +
+
+
+ {#each bookingResponse as bookingResponse} + {#await bookingResponse} +
+ +
+ {:then r} + {#await r.json()} +
+ +
+ {:then res} +
+ + {#if r.ok} + + {:else} + + {/if} + {r.status}: {r.statusText} + + {res.status}: {res.message} + + +
+ {/await} + {:catch e} +
Error: {e}
+ {/await} + {/each} +
+
+
+
+
From c5723bca7c4133e050b7aa45ae5870c6ae270ecf Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Fri, 6 Sep 2024 12:21:58 +0200 Subject: [PATCH 05/44] lint --- src/routes/(user)/taxi/ConfirmationDialog.svelte | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/routes/(user)/taxi/ConfirmationDialog.svelte b/src/routes/(user)/taxi/ConfirmationDialog.svelte index 51a9937e..6b69a87e 100644 --- a/src/routes/(user)/taxi/ConfirmationDialog.svelte +++ b/src/routes/(user)/taxi/ConfirmationDialog.svelte @@ -9,7 +9,6 @@ function handleCancel() { showDialog = false; - // alert('You clicked Cancel!'); } function openDialog() { @@ -18,7 +17,6 @@ {#if showDialog} -

Are you sure?

@@ -41,16 +39,6 @@ z-index: 1000; } - .overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.5); - z-index: 999; - } - button { padding: 10px 20px; margin: 5px; From 86fa899d598494d9b3da72274e5ca93997ca567e Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Fri, 6 Sep 2024 19:10:17 +0200 Subject: [PATCH 06/44] E2E test: addvehicle, set availability, request ride --- .../(user)/taxi/ConfirmationDialog.svelte | 11 --- src/routes/request/+page.svelte | 8 +- tests/setAvailability.test.ts | 76 +++++++++++++++++++ 3 files changed, 80 insertions(+), 15 deletions(-) create mode 100644 tests/setAvailability.test.ts diff --git a/src/routes/(user)/taxi/ConfirmationDialog.svelte b/src/routes/(user)/taxi/ConfirmationDialog.svelte index 51a9937e..6dcc85e3 100644 --- a/src/routes/(user)/taxi/ConfirmationDialog.svelte +++ b/src/routes/(user)/taxi/ConfirmationDialog.svelte @@ -18,7 +18,6 @@ {#if showDialog} -

Are you sure?

@@ -41,16 +40,6 @@ z-index: 1000; } - .overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.5); - z-index: 999; - } - button { padding: 10px 20px; margin: 5px; diff --git a/src/routes/request/+page.svelte b/src/routes/request/+page.svelte index abd32b4e..b1f7f690 100644 --- a/src/routes/request/+page.svelte +++ b/src/routes/request/+page.svelte @@ -24,12 +24,12 @@ let map = $state(); let start = $state({ - lat: 51.343543966724404, - lng: 14.843405973137568 + lat: 51.526934461032994, + lng: 14.57712544716437 }); let destination = $state({ - lat: 51.30359310483892, - lng: 14.901901510528297 + lat: 51.505730979747334, + lng: 14.638267982988827 }); let dummyAddress = { street: '', diff --git a/tests/setAvailability.test.ts b/tests/setAvailability.test.ts new file mode 100644 index 00000000..afa345aa --- /dev/null +++ b/tests/setAvailability.test.ts @@ -0,0 +1,76 @@ +import { expect, test } from '@playwright/test'; +import { login, ENTREPENEUR } from './utils'; + +test.describe.configure({ mode: 'serial' }); + +test('Set company data, complete and consistent', async ({ page }) => { + await login(page, ENTREPENEUR); + await expect(page.getByRole('heading', { name: 'Stammdaten Ihres Unternehmens' })).toBeVisible(); + + await page.getByLabel('Name').fill('Taxi Weißwasser'); + await page + .getByLabel('Unternehmenssitz') + .fill('Werner-Seelenbinder-Straße 70A, 02943 Weißwasser/Oberlausitz'); + await page.waitForTimeout(250); + await page.getByLabel('Pflichtfahrgebiet').selectOption({ label: 'Weißwasser' }); + await page.getByLabel('Gemeinde').selectOption({ label: 'Weißwasser/O.L.' }); + await page.getByRole('button', { name: 'Übernehmen' }).click(); +}); + +test('Set availability', async ({ page }) => { + await login(page, ENTREPENEUR); + await page.getByRole('link', { name: 'Taxi' }).click(); + await expect(page.getByRole('heading', { name: 'Fahrzeuge und Touren' })).toBeVisible(); + await page.waitForTimeout(500); + await page.getByRole('button', { name: 'Fahrzeug hinzufügen' }).click(); + await page.getByPlaceholder('DA-AB-1234').fill('GR-TU-11'); + await page.getByLabel('3 Passagiere').check(); + await page + .locator('button') + .filter({ hasText: /^Fahrzeug hinzufügen$/ }) + .click(); + + await page.goto('/taxi?offset=-120&date=2024-09-12'); + await page.waitForTimeout(500); + await page + .locator( + 'table:nth-child(3) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(1) > .w-8' + ) + .click(); + await page + .locator( + 'table:nth-child(3) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(2) > .w-8' + ) + .click(); + await page + .locator( + 'table:nth-child(3) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(3) > .w-8' + ) + .click(); + await page + .locator( + 'table:nth-child(3) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(4) > .w-8' + ) + .click(); +}); + +test('Request ride', async ({ page }) => { + await login(page, ENTREPENEUR); + await page.goto('/request'); + await page.getByRole('textbox').fill(''); + await page.keyboard.down('0'); + await page.keyboard.down('9'); + await page.keyboard.down('1'); + await page.keyboard.down('2'); + await page.keyboard.down('2'); + await page.keyboard.down('0'); + await page.keyboard.down('2'); + await page.keyboard.down('4'); + await page.keyboard.press('ArrowRight'); + await page.keyboard.down('1'); + await page.keyboard.down('9'); + await page.keyboard.down('4'); + await page.keyboard.down('0'); + await page.getByRole('button', { name: 'Suchen' }).click(); + await expect(page.getByRole('heading', { name: ': OK' })).toHaveText('200: OK'); +}); From 4bc6c647a44cb8eb26c8180e5bdae6da2ecce912 Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Fri, 6 Sep 2024 19:19:00 +0200 Subject: [PATCH 07/44] wip --- .../(user)/taxi/ConfirmationDialog.svelte | 49 ------------------- 1 file changed, 49 deletions(-) delete mode 100644 src/routes/(user)/taxi/ConfirmationDialog.svelte diff --git a/src/routes/(user)/taxi/ConfirmationDialog.svelte b/src/routes/(user)/taxi/ConfirmationDialog.svelte deleted file mode 100644 index 6dcc85e3..00000000 --- a/src/routes/(user)/taxi/ConfirmationDialog.svelte +++ /dev/null @@ -1,49 +0,0 @@ - - -{#if showDialog} -
-

Are you sure?

- - -
-{/if} - - - - From c35df1cd5d51236e1ba8478e1ee2c91fc1f27de2 Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Fri, 6 Sep 2024 19:23:38 +0200 Subject: [PATCH 08/44] wip --- .gitignore | 2 +- booking-generator/test/generator.conf | 11 --------- booking-generator/test/single_request.json | 26 ---------------------- 3 files changed, 1 insertion(+), 38 deletions(-) delete mode 100644 booking-generator/test/generator.conf delete mode 100644 booking-generator/test/single_request.json diff --git a/.gitignore b/.gitignore index 6c9e726d..8b34bc53 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,5 @@ node_modules vite.config.js.timestamp-* vite.config.ts.timestamp-* booking-generator/data/stops.txt -booking-generator/test/ +booking-generator/test .vscode diff --git a/booking-generator/test/generator.conf b/booking-generator/test/generator.conf deleted file mode 100644 index e1f95e23..00000000 --- a/booking-generator/test/generator.conf +++ /dev/null @@ -1,11 +0,0 @@ -{ - "data": "./booking-generator/test/single_request.json", - "single_request": true, - "days": 3, - "max_passengers": 3, - "max_requests": 5, - "max_bookings": null, - "delay": 1, - "url": "http://localhost:5173/api/booking", - "auth": "or5cgzd77zodgexr6nhch3fjbl2ozybk3rw52uab" -} \ No newline at end of file diff --git a/booking-generator/test/single_request.json b/booking-generator/test/single_request.json deleted file mode 100644 index 40ffd349..00000000 --- a/booking-generator/test/single_request.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "from": { - "coordinates": { "lat": 51.18205293877134, "lng": 14.862986488474997 }, - "address": { - "street": "", - "house_number": "", - "city": "", - "postal_code": "" - } - }, - "to": { - "coordinates": { "lat": 51.14937071095368, "lng": 14.93582906557364 }, - "address": { - "street": "", - "house_number": "", - "city": "", - "postal_code": "" - } - }, - "startFixed": true, - "timeStamp": "2024-08-16T14:00:00Z", - "numPassengers": 2, - "numWheelchairs": 0, - "numBikes": 0, - "luggage": 0 -} From 1631559b4d1890be0627fb75708c05f85345a7c8 Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Sat, 7 Sep 2024 15:58:07 +0200 Subject: [PATCH 09/44] test: move tour --- src/lib/ConfirmationDialog.svelte | 2 +- tests/setAvailability.test.ts | 146 +++++++++++++++++------------- 2 files changed, 86 insertions(+), 62 deletions(-) diff --git a/src/lib/ConfirmationDialog.svelte b/src/lib/ConfirmationDialog.svelte index e87229d4..5043aa2a 100644 --- a/src/lib/ConfirmationDialog.svelte +++ b/src/lib/ConfirmationDialog.svelte @@ -37,7 +37,7 @@ Abbrechen - Ok + Bestätigen diff --git a/tests/setAvailability.test.ts b/tests/setAvailability.test.ts index afa345aa..aa8ef51a 100644 --- a/tests/setAvailability.test.ts +++ b/tests/setAvailability.test.ts @@ -4,73 +4,97 @@ import { login, ENTREPENEUR } from './utils'; test.describe.configure({ mode: 'serial' }); test('Set company data, complete and consistent', async ({ page }) => { - await login(page, ENTREPENEUR); - await expect(page.getByRole('heading', { name: 'Stammdaten Ihres Unternehmens' })).toBeVisible(); + await login(page, ENTREPENEUR); + await expect(page.getByRole('heading', { name: 'Stammdaten Ihres Unternehmens' })).toBeVisible(); - await page.getByLabel('Name').fill('Taxi Weißwasser'); - await page - .getByLabel('Unternehmenssitz') - .fill('Werner-Seelenbinder-Straße 70A, 02943 Weißwasser/Oberlausitz'); - await page.waitForTimeout(250); - await page.getByLabel('Pflichtfahrgebiet').selectOption({ label: 'Weißwasser' }); - await page.getByLabel('Gemeinde').selectOption({ label: 'Weißwasser/O.L.' }); - await page.getByRole('button', { name: 'Übernehmen' }).click(); + await page.getByLabel('Name').fill('Taxi Weißwasser'); + await page + .getByLabel('Unternehmenssitz') + .fill('Werner-Seelenbinder-Straße 70A, 02943 Weißwasser/Oberlausitz'); + await page.waitForTimeout(250); + await page.getByLabel('Pflichtfahrgebiet').selectOption({ label: 'Weißwasser' }); + await page.getByLabel('Gemeinde').selectOption({ label: 'Weißwasser/O.L.' }); + await page.getByRole('button', { name: 'Übernehmen' }).click(); }); test('Set availability', async ({ page }) => { - await login(page, ENTREPENEUR); - await page.getByRole('link', { name: 'Taxi' }).click(); - await expect(page.getByRole('heading', { name: 'Fahrzeuge und Touren' })).toBeVisible(); - await page.waitForTimeout(500); - await page.getByRole('button', { name: 'Fahrzeug hinzufügen' }).click(); - await page.getByPlaceholder('DA-AB-1234').fill('GR-TU-11'); - await page.getByLabel('3 Passagiere').check(); - await page - .locator('button') - .filter({ hasText: /^Fahrzeug hinzufügen$/ }) - .click(); + await login(page, ENTREPENEUR); + await page.getByRole('link', { name: 'Taxi' }).click(); + await expect(page.getByRole('heading', { name: 'Fahrzeuge und Touren' })).toBeVisible(); + await page.waitForTimeout(500); + await page.getByRole('button', { name: 'Fahrzeug hinzufügen' }).click(); + await page.getByPlaceholder('DA-AB-1234').fill('GR-TU-11'); + await page.getByLabel('3 Passagiere').check(); + await page + .locator('button') + .filter({ hasText: /^Fahrzeug hinzufügen$/ }) + .click(); - await page.goto('/taxi?offset=-120&date=2024-09-12'); - await page.waitForTimeout(500); - await page - .locator( - 'table:nth-child(3) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(1) > .w-8' - ) - .click(); - await page - .locator( - 'table:nth-child(3) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(2) > .w-8' - ) - .click(); - await page - .locator( - 'table:nth-child(3) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(3) > .w-8' - ) - .click(); - await page - .locator( - 'table:nth-child(3) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(4) > .w-8' - ) - .click(); + await page.goto('/taxi?offset=-120&date=2026-09-30'); + await page.waitForTimeout(500); + await page.mouse.move(425, 465); + await page.mouse.down(); + await page.mouse.move(525, 465); + await page.mouse.up(); }); test('Request ride', async ({ page }) => { - await login(page, ENTREPENEUR); - await page.goto('/request'); - await page.getByRole('textbox').fill(''); - await page.keyboard.down('0'); - await page.keyboard.down('9'); - await page.keyboard.down('1'); - await page.keyboard.down('2'); - await page.keyboard.down('2'); - await page.keyboard.down('0'); - await page.keyboard.down('2'); - await page.keyboard.down('4'); - await page.keyboard.press('ArrowRight'); - await page.keyboard.down('1'); - await page.keyboard.down('9'); - await page.keyboard.down('4'); - await page.keyboard.down('0'); - await page.getByRole('button', { name: 'Suchen' }).click(); - await expect(page.getByRole('heading', { name: ': OK' })).toHaveText('200: OK'); + await login(page, ENTREPENEUR); + await page.waitForTimeout(500); + await page.goto('/request'); + await page.getByRole('textbox').fill(''); + await page.keyboard.down('0'); + await page.keyboard.down('9'); + await page.keyboard.down('3'); + await page.keyboard.down('0'); + await page.keyboard.down('2'); + await page.keyboard.down('0'); + await page.keyboard.down('2'); + await page.keyboard.down('6'); + await page.keyboard.press('ArrowRight'); + await page.keyboard.down('1'); + await page.keyboard.down('0'); + await page.keyboard.down('4'); + await page.keyboard.down('0'); + await page.keyboard.press('ArrowRight'); + await page.keyboard.down('A'); + await page.getByRole('button', { name: 'Suchen' }).click(); + await expect(page.getByRole('heading', { name: ': OK' })).toHaveText('200: OK'); +}); + +test('Move tour to other vehicle', async ({ page }) => { + await login(page, ENTREPENEUR); + await page.getByRole('link', { name: 'Taxi' }).click(); + await expect(page.getByRole('heading', { name: 'Fahrzeuge und Touren' })).toBeVisible(); + await page.waitForTimeout(500); + await page.getByRole('button', { name: 'Fahrzeug hinzufügen' }).click(); + await page.getByPlaceholder('DA-AB-1234').fill('GR-TU-12'); + await page.getByLabel('3 Passagiere').check(); + await page + .locator('button') + .filter({ hasText: /^Fahrzeug hinzufügen$/ }) + .click(); + + await page.goto('/taxi?offset=-120&date=2026-09-30'); + await page.waitForTimeout(1000); + + await page.locator('table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8').first().click(); + await page.getByText('Tour redisponieren').click(); + await page.getByText('Bestätigen').click(); + await page.getByText('Ok').click(); + await page.getByRole('button', { name: 'cross 2, Close' }).click(); + + await expect(page.locator('table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8').first()) + .toHaveCSS('background-color', 'rgb(251, 146, 60)'); + + await page.mouse.move(425, 505); + await page.mouse.down(); + await page.mouse.move(425, 540); + await page.waitForTimeout(1000); + await page.mouse.up(); + + await expect(page.locator('table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8').first()) + .toHaveCSS('background-color', 'rgb(254, 249, 195)'); + await expect(page.locator('.cursor-pointer').first()) + .toHaveCSS('background-color', 'rgb(251, 146, 60)'); }); From 8aa5c66c8d3f12d80520548cf43d5f2c1ad884d3 Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Sat, 7 Sep 2024 15:59:40 +0200 Subject: [PATCH 10/44] format --- tests/setAvailability.test.ts | 169 ++++++++++++++++++---------------- 1 file changed, 92 insertions(+), 77 deletions(-) diff --git a/tests/setAvailability.test.ts b/tests/setAvailability.test.ts index aa8ef51a..8e06ec95 100644 --- a/tests/setAvailability.test.ts +++ b/tests/setAvailability.test.ts @@ -4,97 +4,112 @@ import { login, ENTREPENEUR } from './utils'; test.describe.configure({ mode: 'serial' }); test('Set company data, complete and consistent', async ({ page }) => { - await login(page, ENTREPENEUR); - await expect(page.getByRole('heading', { name: 'Stammdaten Ihres Unternehmens' })).toBeVisible(); + await login(page, ENTREPENEUR); + await expect(page.getByRole('heading', { name: 'Stammdaten Ihres Unternehmens' })).toBeVisible(); - await page.getByLabel('Name').fill('Taxi Weißwasser'); - await page - .getByLabel('Unternehmenssitz') - .fill('Werner-Seelenbinder-Straße 70A, 02943 Weißwasser/Oberlausitz'); - await page.waitForTimeout(250); - await page.getByLabel('Pflichtfahrgebiet').selectOption({ label: 'Weißwasser' }); - await page.getByLabel('Gemeinde').selectOption({ label: 'Weißwasser/O.L.' }); - await page.getByRole('button', { name: 'Übernehmen' }).click(); + await page.getByLabel('Name').fill('Taxi Weißwasser'); + await page + .getByLabel('Unternehmenssitz') + .fill('Werner-Seelenbinder-Straße 70A, 02943 Weißwasser/Oberlausitz'); + await page.waitForTimeout(250); + await page.getByLabel('Pflichtfahrgebiet').selectOption({ label: 'Weißwasser' }); + await page.getByLabel('Gemeinde').selectOption({ label: 'Weißwasser/O.L.' }); + await page.getByRole('button', { name: 'Übernehmen' }).click(); }); test('Set availability', async ({ page }) => { - await login(page, ENTREPENEUR); - await page.getByRole('link', { name: 'Taxi' }).click(); - await expect(page.getByRole('heading', { name: 'Fahrzeuge und Touren' })).toBeVisible(); - await page.waitForTimeout(500); - await page.getByRole('button', { name: 'Fahrzeug hinzufügen' }).click(); - await page.getByPlaceholder('DA-AB-1234').fill('GR-TU-11'); - await page.getByLabel('3 Passagiere').check(); - await page - .locator('button') - .filter({ hasText: /^Fahrzeug hinzufügen$/ }) - .click(); + await login(page, ENTREPENEUR); + await page.getByRole('link', { name: 'Taxi' }).click(); + await expect(page.getByRole('heading', { name: 'Fahrzeuge und Touren' })).toBeVisible(); + await page.waitForTimeout(500); + await page.getByRole('button', { name: 'Fahrzeug hinzufügen' }).click(); + await page.getByPlaceholder('DA-AB-1234').fill('GR-TU-11'); + await page.getByLabel('3 Passagiere').check(); + await page + .locator('button') + .filter({ hasText: /^Fahrzeug hinzufügen$/ }) + .click(); - await page.goto('/taxi?offset=-120&date=2026-09-30'); - await page.waitForTimeout(500); - await page.mouse.move(425, 465); - await page.mouse.down(); - await page.mouse.move(525, 465); - await page.mouse.up(); + await page.goto('/taxi?offset=-120&date=2026-09-30'); + await page.waitForTimeout(500); + await page.mouse.move(425, 465); + await page.mouse.down(); + await page.mouse.move(525, 465); + await page.mouse.up(); }); test('Request ride', async ({ page }) => { - await login(page, ENTREPENEUR); - await page.waitForTimeout(500); - await page.goto('/request'); - await page.getByRole('textbox').fill(''); - await page.keyboard.down('0'); - await page.keyboard.down('9'); - await page.keyboard.down('3'); - await page.keyboard.down('0'); - await page.keyboard.down('2'); - await page.keyboard.down('0'); - await page.keyboard.down('2'); - await page.keyboard.down('6'); - await page.keyboard.press('ArrowRight'); - await page.keyboard.down('1'); - await page.keyboard.down('0'); - await page.keyboard.down('4'); - await page.keyboard.down('0'); - await page.keyboard.press('ArrowRight'); - await page.keyboard.down('A'); - await page.getByRole('button', { name: 'Suchen' }).click(); - await expect(page.getByRole('heading', { name: ': OK' })).toHaveText('200: OK'); + await login(page, ENTREPENEUR); + await page.waitForTimeout(500); + await page.goto('/request'); + await page.getByRole('textbox').fill(''); + await page.keyboard.down('0'); + await page.keyboard.down('9'); + await page.keyboard.down('3'); + await page.keyboard.down('0'); + await page.keyboard.down('2'); + await page.keyboard.down('0'); + await page.keyboard.down('2'); + await page.keyboard.down('6'); + await page.keyboard.press('ArrowRight'); + await page.keyboard.down('1'); + await page.keyboard.down('0'); + await page.keyboard.down('4'); + await page.keyboard.down('0'); + await page.keyboard.press('ArrowRight'); + await page.keyboard.down('A'); + await page.getByRole('button', { name: 'Suchen' }).click(); + await expect(page.getByRole('heading', { name: ': OK' })).toHaveText('200: OK'); }); test('Move tour to other vehicle', async ({ page }) => { - await login(page, ENTREPENEUR); - await page.getByRole('link', { name: 'Taxi' }).click(); - await expect(page.getByRole('heading', { name: 'Fahrzeuge und Touren' })).toBeVisible(); - await page.waitForTimeout(500); - await page.getByRole('button', { name: 'Fahrzeug hinzufügen' }).click(); - await page.getByPlaceholder('DA-AB-1234').fill('GR-TU-12'); - await page.getByLabel('3 Passagiere').check(); - await page - .locator('button') - .filter({ hasText: /^Fahrzeug hinzufügen$/ }) - .click(); + await login(page, ENTREPENEUR); + await page.getByRole('link', { name: 'Taxi' }).click(); + await expect(page.getByRole('heading', { name: 'Fahrzeuge und Touren' })).toBeVisible(); + await page.waitForTimeout(500); + await page.getByRole('button', { name: 'Fahrzeug hinzufügen' }).click(); + await page.getByPlaceholder('DA-AB-1234').fill('GR-TU-12'); + await page.getByLabel('3 Passagiere').check(); + await page + .locator('button') + .filter({ hasText: /^Fahrzeug hinzufügen$/ }) + .click(); - await page.goto('/taxi?offset=-120&date=2026-09-30'); - await page.waitForTimeout(1000); + await page.goto('/taxi?offset=-120&date=2026-09-30'); + await page.waitForTimeout(1000); - await page.locator('table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8').first().click(); - await page.getByText('Tour redisponieren').click(); - await page.getByText('Bestätigen').click(); - await page.getByText('Ok').click(); - await page.getByRole('button', { name: 'cross 2, Close' }).click(); + await page + .locator('table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8') + .first() + .click(); + await page.getByText('Tour redisponieren').click(); + await page.getByText('Bestätigen').click(); + await page.getByText('Ok').click(); + await page.getByRole('button', { name: 'cross 2, Close' }).click(); - await expect(page.locator('table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8').first()) - .toHaveCSS('background-color', 'rgb(251, 146, 60)'); + await expect( + page + .locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8' + ) + .first() + ).toHaveCSS('background-color', 'rgb(251, 146, 60)'); - await page.mouse.move(425, 505); - await page.mouse.down(); - await page.mouse.move(425, 540); - await page.waitForTimeout(1000); - await page.mouse.up(); + await page.mouse.move(425, 505); + await page.mouse.down(); + await page.mouse.move(425, 540); + await page.waitForTimeout(1000); + await page.mouse.up(); - await expect(page.locator('table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8').first()) - .toHaveCSS('background-color', 'rgb(254, 249, 195)'); - await expect(page.locator('.cursor-pointer').first()) - .toHaveCSS('background-color', 'rgb(251, 146, 60)'); + await expect( + page + .locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8' + ) + .first() + ).toHaveCSS('background-color', 'rgb(254, 249, 195)'); + await expect(page.locator('.cursor-pointer').first()).toHaveCSS( + 'background-color', + 'rgb(251, 146, 60)' + ); }); From 57f597cf51a94fc5b55ab3bfc54b47b755e3549c Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Mon, 9 Sep 2024 10:10:17 +0200 Subject: [PATCH 11/44] wip --- tests/setAvailability.test.ts | 16 +++---------- tests/tourRedisposition.test.ts | 0 tests/utils.ts | 40 ++++++++++++++++++++++++++++++++- 3 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 tests/tourRedisposition.test.ts diff --git a/tests/setAvailability.test.ts b/tests/setAvailability.test.ts index 8e06ec95..12cc0a9b 100644 --- a/tests/setAvailability.test.ts +++ b/tests/setAvailability.test.ts @@ -1,20 +1,10 @@ import { expect, test } from '@playwright/test'; -import { login, ENTREPENEUR } from './utils'; +import { login, ENTREPENEUR, setCompanyData, COMPANY1 } from './utils'; test.describe.configure({ mode: 'serial' }); -test('Set company data, complete and consistent', async ({ page }) => { - await login(page, ENTREPENEUR); - await expect(page.getByRole('heading', { name: 'Stammdaten Ihres Unternehmens' })).toBeVisible(); - - await page.getByLabel('Name').fill('Taxi Weißwasser'); - await page - .getByLabel('Unternehmenssitz') - .fill('Werner-Seelenbinder-Straße 70A, 02943 Weißwasser/Oberlausitz'); - await page.waitForTimeout(250); - await page.getByLabel('Pflichtfahrgebiet').selectOption({ label: 'Weißwasser' }); - await page.getByLabel('Gemeinde').selectOption({ label: 'Weißwasser/O.L.' }); - await page.getByRole('button', { name: 'Übernehmen' }).click(); +test('Set company data', async ({ page }) => { + await setCompanyData(page, ENTREPENEUR, COMPANY1); }); test('Set availability', async ({ page }) => { diff --git a/tests/tourRedisposition.test.ts b/tests/tourRedisposition.test.ts new file mode 100644 index 00000000..e69de29b diff --git a/tests/utils.ts b/tests/utils.ts index 4f695a3e..4eb25611 100644 --- a/tests/utils.ts +++ b/tests/utils.ts @@ -5,16 +5,42 @@ export type UserCredentials = { password: string; }; +export type Company = { + name: string; + address: string; + zone: string; + community: string; +}; + export const MAINTAINER: UserCredentials = { email: 'master@example.com', password: 'longEnough1' }; export const ENTREPENEUR: UserCredentials = { - email: 'taxi@example.com', + email: 'taxi1@test.de', + password: 'longEnough2' +}; + +export const ENTREPENEUR2: UserCredentials = { + email: 'taxi2@test.de', password: 'longEnough2' }; +export const COMPANY1: Company = { + name: 'Taxi Weißwasser', + address: 'Werner-Seelenbinder-Straße 70A, 02943 Weißwasser/Oberlausitz', + zone: 'Weißwasser', + community: 'Weißwasser/O.L.' +}; + +export const COMPANY2: Company = { + name: 'Taxi Gablenz', + address: 'Schulstraße 21, 02953 Gablenz', + zone: 'Weißwasser', + community: 'Gablenz' +}; + export async function login(page: Page, credentials: UserCredentials) { await page.goto('/login'); await expect(page.getByRole('heading', { name: 'Login' })).toBeVisible(); @@ -33,3 +59,15 @@ export async function signup(page: Page, credentials: UserCredentials) { page.getByRole('heading', { name: 'Willkommen beim Projekt PrimaÖV!' }) ).toBeVisible(); } + +export async function setCompanyData(page: Page, user: UserCredentials, company: Company) { + await login(page, user); + await expect(page.getByRole('heading', { name: 'Stammdaten Ihres Unternehmens' })).toBeVisible(); + + await page.getByLabel('Name').fill(company.name); + await page.getByLabel('Unternehmenssitz').fill(company.address); + await page.waitForTimeout(250); + await page.getByLabel('Pflichtfahrgebiet').selectOption({ label: company.zone }); + await page.getByLabel('Gemeinde').selectOption({ label: company.community }); + await page.getByRole('button', { name: 'Übernehmen' }).click(); +} From beaea16e4142361113ade98fd05363c7515f4932 Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 11 Sep 2024 10:27:31 +0200 Subject: [PATCH 12/44] wip --- playwright.config.ts | 21 +++- src/routes/(user)/+layout.svelte | 4 + .../(user)/administration/+page.server.ts | 44 ++++++++ src/routes/(user)/administration/+page.svelte | 93 ++++++++++++++++ src/routes/(user)/drivers/+page.server.ts | 23 +++- src/routes/(user)/drivers/+page.svelte | 35 ++++-- src/routes/api/user/+server.ts | 57 ++++++++++ tests/availability.ts | 59 ++++++++++ tests/{companyData.test.ts => companyData.ts} | 0 tests/entrepreneurAssignsRoles.test.ts | 0 tests/entrepreneurAssignsRoles.ts | 42 +++++++ tests/moveTour.ts | 35 ++++++ tests/redisposeTour.ts | 19 ++++ tests/setAvailability.test.ts | 105 ------------------ tests/tourRedisposition.test.ts | 0 tests/utils.ts | 17 +++ 16 files changed, 429 insertions(+), 125 deletions(-) create mode 100644 src/routes/(user)/administration/+page.server.ts create mode 100644 src/routes/(user)/administration/+page.svelte create mode 100644 src/routes/api/user/+server.ts create mode 100644 tests/availability.ts rename tests/{companyData.test.ts => companyData.ts} (100%) delete mode 100644 tests/entrepreneurAssignsRoles.test.ts create mode 100644 tests/entrepreneurAssignsRoles.ts create mode 100644 tests/moveTour.ts create mode 100644 tests/redisposeTour.ts delete mode 100644 tests/setAvailability.test.ts delete mode 100644 tests/tourRedisposition.test.ts diff --git a/playwright.config.ts b/playwright.config.ts index baaf320a..6f0b22a8 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -31,9 +31,24 @@ export default defineConfig({ dependencies: ['setup db'] }, { - name: 'user test', - testMatch: /(.+\.)?(test|spec)\.[jt]s/, - dependencies: ['setup db', 'login'] + name: 'entrepreneurAssignsRoles', + testMatch: /entrepreneurAssignsRoles\.ts/, + dependencies: ['login'] + }, + { + name: 'availability', + testMatch: /availability\.ts/, + dependencies: ['login'] + }, + { + name: 'move tour', + testMatch: /moveTour\.ts/, + dependencies: ['availability'] + }, + { + name: 'resdispose tour', + testMatch: /redisposeTour\.ts/, + dependencies: ['availability'] } ] }); diff --git a/src/routes/(user)/+layout.svelte b/src/routes/(user)/+layout.svelte index 39f85645..ce0c3998 100644 --- a/src/routes/(user)/+layout.svelte +++ b/src/routes/(user)/+layout.svelte @@ -19,6 +19,10 @@ { name: 'Fahrer', href: '/drivers' + }, + { + name: 'Verwaltung', + href: '/administration' } ]; diff --git a/src/routes/(user)/administration/+page.server.ts b/src/routes/(user)/administration/+page.server.ts new file mode 100644 index 00000000..20519a6f --- /dev/null +++ b/src/routes/(user)/administration/+page.server.ts @@ -0,0 +1,44 @@ +import type { Actions } from './$types'; +import { db } from '$lib/database'; +import { fail } from '@sveltejs/kit'; +import type { PageServerLoad } from './$types.js'; + +export const load: PageServerLoad = async (event) => { + const administrators = await db + .selectFrom('auth_user') + .where('company_id', '=', event.locals.user!.company!) + .where('is_entrepreneur', '=', true) + .selectAll() + .execute(); + return { + administrators + }; +}; + +export const actions = { + default: async (event) => { + const email = (await event.request.formData()).get('email')!.toString(); + const companyId = event.locals.user!.company!; + if (!email) { + return fail(400, { email, missing: true }); + } + try { + const user = await db + .selectFrom('auth_user') + .where('email', '=', email) + .selectAll() + .executeTakeFirstOrThrow(); + if (user.company_id != null && user.is_entrepreneur) { + return { existed: true }; + } + await db + .updateTable('auth_user') + .set({ company_id: companyId, is_entrepreneur: true }) + .where('email', '=', email) + .executeTakeFirst(); + } catch { + return fail(400, { email, incorrect: true }); + } + return { updated: true }; + } +} satisfies Actions; diff --git a/src/routes/(user)/administration/+page.svelte b/src/routes/(user)/administration/+page.svelte new file mode 100644 index 00000000..2abd07c5 --- /dev/null +++ b/src/routes/(user)/administration/+page.svelte @@ -0,0 +1,93 @@ + + +
+ {@render assignment()} + {@render drivers()} +
+ +{#snippet assignment()} + + + Verwalter freischalten + + +
+
+ +
+ +
+
+
+
+
+{/snippet} + +{#snippet drivers()} + + + Inhaber + + + + + + Email + + + + + {#each data.administrators as admin} + + {admin.email} + + + {/each} + + + + +{/snippet} diff --git a/src/routes/(user)/drivers/+page.server.ts b/src/routes/(user)/drivers/+page.server.ts index 5c744ab9..6f81c2f4 100644 --- a/src/routes/(user)/drivers/+page.server.ts +++ b/src/routes/(user)/drivers/+page.server.ts @@ -1,11 +1,24 @@ import type { Actions } from './$types'; import { db } from '$lib/database'; import { fail } from '@sveltejs/kit'; +import type { PageServerLoad } from './$types.js'; + +export const load: PageServerLoad = async (event) => { + const drivers = await db + .selectFrom('auth_user') + .where('company_id', '=', event.locals.user!.company!) + .where('is_entrepreneur', '=', false) + .selectAll() + .execute(); + return { + drivers + }; +}; export const actions = { - default: async ({ request }) => { - const email = (await request.formData()).get('email')!.toString(); - const companyId = 0; + default: async (event) => { + const email = (await event.request.formData()).get('email')!.toString(); + const companyId = event.locals.user!.company!; if (!email) { return fail(400, { email, missing: true }); } @@ -15,12 +28,12 @@ export const actions = { .where('email', '=', email) .selectAll() .executeTakeFirstOrThrow(); - if (user.is_driver) { + if (user.company_id != null) { return { existed: true }; } await db .updateTable('auth_user') - .set({ company_id: companyId, is_driver: true }) + .set({ company_id: companyId }) .where('email', '=', email) .executeTakeFirst(); } catch { diff --git a/src/routes/(user)/drivers/+page.svelte b/src/routes/(user)/drivers/+page.svelte index 8b22c5bf..624faf4c 100644 --- a/src/routes/(user)/drivers/+page.svelte +++ b/src/routes/(user)/drivers/+page.svelte @@ -4,9 +4,18 @@ import { Input } from '$lib/components/ui/input'; import { Label } from '$lib/components/ui/label'; import * as Table from '$lib/components/ui/table/index.js'; - import type { ActionData } from './$types'; + import { invalidateAll } from '$app/navigation'; + import type { ActionData, PageData } from './$types'; - export let form: ActionData; + const { data, form } = $props<{ data: PageData; form: ActionData }>(); + + const removeUser = async (email: string) => { + const response = await fetch('/api/user', { + method: 'PUT', + body: JSON.stringify({ email }) + }); + invalidateAll(); + };
@@ -36,7 +45,7 @@ {/if} {#if form?.updated}
- Freischalten erfolgreich! + Freischaltung erfolgreich!
{/if} {#if form?.existed} @@ -47,7 +56,7 @@
- +
@@ -64,17 +73,19 @@ - Name - Vorname - Fahrzeug + Email + - - TODO - TODO - TODO - + {#each data.drivers as driver} + + {driver.email} + + + {/each} diff --git a/src/routes/api/user/+server.ts b/src/routes/api/user/+server.ts new file mode 100644 index 00000000..e661b898 --- /dev/null +++ b/src/routes/api/user/+server.ts @@ -0,0 +1,57 @@ +import { error, json } from '@sveltejs/kit'; +import { db } from '$lib/database'; + +export const PUT = async (event) => { + const company = event.locals.user?.company; + if (!company) { + error(400, { + message: 'not allowed without write access to company' + }); + } + const request = event.request; + const userMail = event.locals.user?.email; + try { + const { email } = + await request.json(); + if (email == userMail) { + error(400, { + message: 'not allowed for this user' + }); + } + const user = await db + .selectFrom('auth_user') + .where('company_id', '=', company) + .where('email', '=', email) + .selectAll() + .executeTakeFirst(); + if (user == null) { + error(404, { + message: 'user not found' + }); + } + if (user!.is_entrepreneur) { + await db + .updateTable('auth_user') + .set({ + is_entrepreneur: false + }) + .where('company_id', '=', company) + .where('email', '=', email) + .executeTakeFirst(); + } else { + await db + .updateTable('auth_user') + .set({ + company_id: null + }) + .where('company_id', '=', company) + .where('email', '=', email) + .executeTakeFirst(); + } + } catch (e) { + error(500, { + message: 'An unknown error occurred' + }); + } + return json({}); +}; diff --git a/tests/availability.ts b/tests/availability.ts new file mode 100644 index 00000000..04105e0b --- /dev/null +++ b/tests/availability.ts @@ -0,0 +1,59 @@ +import { expect, test, type Page } from '@playwright/test'; +import { login, setCompanyData, addVehicle, ENTREPENEUR, COMPANY1 } from './utils'; + +export async function setAvailability(page: Page) { + await login(page, ENTREPENEUR); + await page.goto('/taxi?offset=-120&date=2026-09-30'); + await page.waitForTimeout(500); + + await page.mouse.move(425, 465); + await page.mouse.down(); + await page.mouse.move(525, 465); + await page.mouse.up(); +} + +export async function requestRide(page: Page) { + await login(page, ENTREPENEUR); + await page.goto('/request'); + await page.waitForTimeout(500); + + await page.getByRole('textbox').fill(''); + await page.keyboard.down('0'); + await page.keyboard.down('9'); + await page.keyboard.down('3'); + await page.keyboard.down('0'); + await page.keyboard.down('2'); + await page.keyboard.down('0'); + await page.keyboard.down('2'); + await page.keyboard.down('6'); + await page.keyboard.press('ArrowRight'); + await page.keyboard.down('1'); + await page.keyboard.down('0'); + await page.keyboard.down('4'); + await page.keyboard.down('0'); + await page.keyboard.press('ArrowRight'); + await page.keyboard.down('A'); + await page.getByRole('button', { name: 'Suchen' }).click(); + await expect(page.getByRole('heading', { name: ': OK' })).toHaveText('200: OK'); +} + +test.describe.configure({ mode: 'serial' }); + +test('Set company data', async ({ page }) => { + await setCompanyData(page, ENTREPENEUR, COMPANY1); +}); + +test('Add vehicle', async ({ page }) => { + await addVehicle(page, 'GR-TU-11'); + // TODO: check +}); + +test('Set availability', async ({ page }) => { + await setAvailability(page); + // TODO: check +}); + +test('Request ride', async ({ page }) => { + await requestRide(page); + // TODO: check +}); diff --git a/tests/companyData.test.ts b/tests/companyData.ts similarity index 100% rename from tests/companyData.test.ts rename to tests/companyData.ts diff --git a/tests/entrepreneurAssignsRoles.test.ts b/tests/entrepreneurAssignsRoles.test.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/entrepreneurAssignsRoles.ts b/tests/entrepreneurAssignsRoles.ts new file mode 100644 index 00000000..a6a59718 --- /dev/null +++ b/tests/entrepreneurAssignsRoles.ts @@ -0,0 +1,42 @@ +import { expect, test } from '@playwright/test'; +import { ENTREPENEUR, setCompanyData, signup, COMPANY1, login } from './utils'; + +test.describe.configure({ mode: 'serial' }); + +test('Activate driver', async ({ page }) => { + await signup(page, { email: 'driver@test.de', password: 'longEnough3' }); + await setCompanyData(page, ENTREPENEUR, COMPANY1); + await page.getByRole('link', { name: 'Fahrer' }).click(); + await page.getByLabel('Email').fill('driver@test.de'); + await page.getByRole('button', { name: 'Freischalten' }).click(); + await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); + await expect(page.getByRole('cell', { name: 'driver@test.de' })).toHaveText('driver@test.de'); +}); + +test('Deactivate driver', async ({ page }) => { + await login(page, ENTREPENEUR); + await page.getByRole('link', { name: 'Fahrer' }).click(); + await page.waitForTimeout(200); + await page.getByRole('button', { name: 'x' }).click(); + await page.waitForTimeout(200); + await expect(page.getByRole('cell', { name: 'driver@test.de' })).not.toBeVisible(); +}); + +test('Activate administrator', async ({ page }) => { + await signup(page, { email: 'admin2@test.de', password: 'longEnough3' }); + await setCompanyData(page, ENTREPENEUR, COMPANY1); + await page.getByRole('link', { name: 'Verwaltung' }).click(); + await page.getByLabel('Email').fill('admin2@test.de'); + await page.getByRole('button', { name: 'Freischalten' }).click(); + await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); + await expect(page.getByRole('cell', { name: 'admin2@test.de' })).toBeVisible(); +}); + +test('Deactivate administrator', async ({ page }) => { + await login(page, ENTREPENEUR); + await page.getByRole('link', { name: 'Verwaltung' }).click(); + await page.waitForTimeout(200); + await page.getByRole('row', { name: 'admin2@test.de x' }).getByRole('button').click(); + await page.waitForTimeout(200); + await expect(page.getByRole('cell', { name: 'admin2@test.de' })).not.toBeVisible(); +}); \ No newline at end of file diff --git a/tests/moveTour.ts b/tests/moveTour.ts new file mode 100644 index 00000000..ced30733 --- /dev/null +++ b/tests/moveTour.ts @@ -0,0 +1,35 @@ +import { test, expect } from '@playwright/test'; +import { addVehicle } from './utils'; + +test('Move tour to other vehicle', async ({ page }) => { + await addVehicle(page, 'GR-TU-12'); + + await page.goto('/taxi?offset=-120&date=2026-09-30'); + await page.waitForTimeout(1000); + + await expect( + page + .locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8' + ) + .first() + ).toHaveCSS('background-color', 'rgb(251, 146, 60)'); + + await page.mouse.move(425, 505); + await page.mouse.down(); + await page.mouse.move(425, 540); + await page.waitForTimeout(1000); + await page.mouse.up(); + + await expect( + page + .locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8' + ) + .first() + ).toHaveCSS('background-color', 'rgb(254, 249, 195)'); + await expect(page.locator('.cursor-pointer').first()).toHaveCSS( + 'background-color', + 'rgb(251, 146, 60)' + ); +}); \ No newline at end of file diff --git a/tests/redisposeTour.ts b/tests/redisposeTour.ts new file mode 100644 index 00000000..bd2f6819 --- /dev/null +++ b/tests/redisposeTour.ts @@ -0,0 +1,19 @@ +import { expect, test } from '@playwright/test'; +import { login, ENTREPENEUR } from './utils'; + +test('Redispose tour', async ({ page }) => { + await login(page, ENTREPENEUR); + await page.goto('/taxi?offset=-120&date=2026-09-30'); + await page.waitForTimeout(1000); + + await page + .locator('table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8') + .first() + .click(); + await page.getByText('Tour redisponieren').click(); + await page.getByText('Bestätigen').click(); + await page.getByText('Ok').click(); + await page.getByRole('button', { name: 'cross 2, Close' }).click(); + + // TODO: check +}); \ No newline at end of file diff --git a/tests/setAvailability.test.ts b/tests/setAvailability.test.ts deleted file mode 100644 index 12cc0a9b..00000000 --- a/tests/setAvailability.test.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { login, ENTREPENEUR, setCompanyData, COMPANY1 } from './utils'; - -test.describe.configure({ mode: 'serial' }); - -test('Set company data', async ({ page }) => { - await setCompanyData(page, ENTREPENEUR, COMPANY1); -}); - -test('Set availability', async ({ page }) => { - await login(page, ENTREPENEUR); - await page.getByRole('link', { name: 'Taxi' }).click(); - await expect(page.getByRole('heading', { name: 'Fahrzeuge und Touren' })).toBeVisible(); - await page.waitForTimeout(500); - await page.getByRole('button', { name: 'Fahrzeug hinzufügen' }).click(); - await page.getByPlaceholder('DA-AB-1234').fill('GR-TU-11'); - await page.getByLabel('3 Passagiere').check(); - await page - .locator('button') - .filter({ hasText: /^Fahrzeug hinzufügen$/ }) - .click(); - - await page.goto('/taxi?offset=-120&date=2026-09-30'); - await page.waitForTimeout(500); - await page.mouse.move(425, 465); - await page.mouse.down(); - await page.mouse.move(525, 465); - await page.mouse.up(); -}); - -test('Request ride', async ({ page }) => { - await login(page, ENTREPENEUR); - await page.waitForTimeout(500); - await page.goto('/request'); - await page.getByRole('textbox').fill(''); - await page.keyboard.down('0'); - await page.keyboard.down('9'); - await page.keyboard.down('3'); - await page.keyboard.down('0'); - await page.keyboard.down('2'); - await page.keyboard.down('0'); - await page.keyboard.down('2'); - await page.keyboard.down('6'); - await page.keyboard.press('ArrowRight'); - await page.keyboard.down('1'); - await page.keyboard.down('0'); - await page.keyboard.down('4'); - await page.keyboard.down('0'); - await page.keyboard.press('ArrowRight'); - await page.keyboard.down('A'); - await page.getByRole('button', { name: 'Suchen' }).click(); - await expect(page.getByRole('heading', { name: ': OK' })).toHaveText('200: OK'); -}); - -test('Move tour to other vehicle', async ({ page }) => { - await login(page, ENTREPENEUR); - await page.getByRole('link', { name: 'Taxi' }).click(); - await expect(page.getByRole('heading', { name: 'Fahrzeuge und Touren' })).toBeVisible(); - await page.waitForTimeout(500); - await page.getByRole('button', { name: 'Fahrzeug hinzufügen' }).click(); - await page.getByPlaceholder('DA-AB-1234').fill('GR-TU-12'); - await page.getByLabel('3 Passagiere').check(); - await page - .locator('button') - .filter({ hasText: /^Fahrzeug hinzufügen$/ }) - .click(); - - await page.goto('/taxi?offset=-120&date=2026-09-30'); - await page.waitForTimeout(1000); - - await page - .locator('table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8') - .first() - .click(); - await page.getByText('Tour redisponieren').click(); - await page.getByText('Bestätigen').click(); - await page.getByText('Ok').click(); - await page.getByRole('button', { name: 'cross 2, Close' }).click(); - - await expect( - page - .locator( - 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8' - ) - .first() - ).toHaveCSS('background-color', 'rgb(251, 146, 60)'); - - await page.mouse.move(425, 505); - await page.mouse.down(); - await page.mouse.move(425, 540); - await page.waitForTimeout(1000); - await page.mouse.up(); - - await expect( - page - .locator( - 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8' - ) - .first() - ).toHaveCSS('background-color', 'rgb(254, 249, 195)'); - await expect(page.locator('.cursor-pointer').first()).toHaveCSS( - 'background-color', - 'rgb(251, 146, 60)' - ); -}); diff --git a/tests/tourRedisposition.test.ts b/tests/tourRedisposition.test.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/utils.ts b/tests/utils.ts index 4eb25611..42ec01a1 100644 --- a/tests/utils.ts +++ b/tests/utils.ts @@ -58,6 +58,8 @@ export async function signup(page: Page, credentials: UserCredentials) { await expect( page.getByRole('heading', { name: 'Willkommen beim Projekt PrimaÖV!' }) ).toBeVisible(); + await page.getByRole('link', { name: 'Logout' }).click(); + } export async function setCompanyData(page: Page, user: UserCredentials, company: Company) { @@ -71,3 +73,18 @@ export async function setCompanyData(page: Page, user: UserCredentials, company: await page.getByLabel('Gemeinde').selectOption({ label: company.community }); await page.getByRole('button', { name: 'Übernehmen' }).click(); } + +export async function addVehicle(page: Page, licensePlate: string) { + await login(page, ENTREPENEUR); + await page.goto('/company'); + await page.getByRole('link', { name: 'Taxi' }).click(); + await expect(page.getByRole('heading', { name: 'Fahrzeuge und Touren' })).toBeVisible(); + await page.waitForTimeout(500); + await page.getByRole('button', { name: 'Fahrzeug hinzufügen' }).click(); + await page.getByPlaceholder('DA-AB-1234').fill(licensePlate); + await page.getByLabel('3 Passagiere').check(); + await page + .locator('button') + .filter({ hasText: /^Fahrzeug hinzufügen$/ }) + .click(); +} From 08dbd38cd3f5fb3f453d2c17077c03e7b1fd1904 Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 11 Sep 2024 10:43:40 +0200 Subject: [PATCH 13/44] drop is_driver from auth_user --- migrations/2024-09-11-0.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 migrations/2024-09-11-0.js diff --git a/migrations/2024-09-11-0.js b/migrations/2024-09-11-0.js new file mode 100644 index 00000000..ccd73deb --- /dev/null +++ b/migrations/2024-09-11-0.js @@ -0,0 +1,15 @@ +export async function up(db) { + await db.schema + .alterTable('auth_user') + .dropColumn('is_driver') + .execute(); +} + +export async function down(db) { + await db.schema + .alterTable('auth_user') + .addColumn('is_driver', 'boolean', (col) => + col.notNull().defaultTo(false), + ) + .execute(); +} From 2ac69f8cd1c7662d8819f75e328f3ad79e32131e Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 11 Sep 2024 10:44:06 +0200 Subject: [PATCH 14/44] format+lint --- src/lib/types.ts | 1 - src/routes/(user)/drivers/+page.svelte | 2 +- src/routes/api/user/+server.ts | 3 +- tests/entrepreneurAssignsRoles.ts | 54 +++++++++++++------------- tests/moveTour.ts | 54 +++++++++++++------------- tests/redisposeTour.ts | 28 ++++++------- tests/utils.ts | 1 - 7 files changed, 70 insertions(+), 73 deletions(-) diff --git a/src/lib/types.ts b/src/lib/types.ts index d0f4604e..c1daf0e9 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -100,7 +100,6 @@ export interface UserAuthTable { password_hash: string; is_entrepreneur: boolean; is_maintainer: boolean; - is_driver: boolean; first_name: string | null; last_name: string | null; phone: string | null; diff --git a/src/routes/(user)/drivers/+page.svelte b/src/routes/(user)/drivers/+page.svelte index 624faf4c..6b0a0cd2 100644 --- a/src/routes/(user)/drivers/+page.svelte +++ b/src/routes/(user)/drivers/+page.svelte @@ -10,7 +10,7 @@ const { data, form } = $props<{ data: PageData; form: ActionData }>(); const removeUser = async (email: string) => { - const response = await fetch('/api/user', { + await fetch('/api/user', { method: 'PUT', body: JSON.stringify({ email }) }); diff --git a/src/routes/api/user/+server.ts b/src/routes/api/user/+server.ts index e661b898..652e4579 100644 --- a/src/routes/api/user/+server.ts +++ b/src/routes/api/user/+server.ts @@ -11,8 +11,7 @@ export const PUT = async (event) => { const request = event.request; const userMail = event.locals.user?.email; try { - const { email } = - await request.json(); + const { email } = await request.json(); if (email == userMail) { error(400, { message: 'not allowed for this user' diff --git a/tests/entrepreneurAssignsRoles.ts b/tests/entrepreneurAssignsRoles.ts index a6a59718..7148390e 100644 --- a/tests/entrepreneurAssignsRoles.ts +++ b/tests/entrepreneurAssignsRoles.ts @@ -4,39 +4,39 @@ import { ENTREPENEUR, setCompanyData, signup, COMPANY1, login } from './utils'; test.describe.configure({ mode: 'serial' }); test('Activate driver', async ({ page }) => { - await signup(page, { email: 'driver@test.de', password: 'longEnough3' }); - await setCompanyData(page, ENTREPENEUR, COMPANY1); - await page.getByRole('link', { name: 'Fahrer' }).click(); - await page.getByLabel('Email').fill('driver@test.de'); - await page.getByRole('button', { name: 'Freischalten' }).click(); - await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); - await expect(page.getByRole('cell', { name: 'driver@test.de' })).toHaveText('driver@test.de'); + await signup(page, { email: 'driver@test.de', password: 'longEnough3' }); + await setCompanyData(page, ENTREPENEUR, COMPANY1); + await page.getByRole('link', { name: 'Fahrer' }).click(); + await page.getByLabel('Email').fill('driver@test.de'); + await page.getByRole('button', { name: 'Freischalten' }).click(); + await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); + await expect(page.getByRole('cell', { name: 'driver@test.de' })).toHaveText('driver@test.de'); }); test('Deactivate driver', async ({ page }) => { - await login(page, ENTREPENEUR); - await page.getByRole('link', { name: 'Fahrer' }).click(); - await page.waitForTimeout(200); - await page.getByRole('button', { name: 'x' }).click(); - await page.waitForTimeout(200); - await expect(page.getByRole('cell', { name: 'driver@test.de' })).not.toBeVisible(); + await login(page, ENTREPENEUR); + await page.getByRole('link', { name: 'Fahrer' }).click(); + await page.waitForTimeout(200); + await page.getByRole('button', { name: 'x' }).click(); + await page.waitForTimeout(200); + await expect(page.getByRole('cell', { name: 'driver@test.de' })).not.toBeVisible(); }); test('Activate administrator', async ({ page }) => { - await signup(page, { email: 'admin2@test.de', password: 'longEnough3' }); - await setCompanyData(page, ENTREPENEUR, COMPANY1); - await page.getByRole('link', { name: 'Verwaltung' }).click(); - await page.getByLabel('Email').fill('admin2@test.de'); - await page.getByRole('button', { name: 'Freischalten' }).click(); - await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); - await expect(page.getByRole('cell', { name: 'admin2@test.de' })).toBeVisible(); + await signup(page, { email: 'admin2@test.de', password: 'longEnough3' }); + await setCompanyData(page, ENTREPENEUR, COMPANY1); + await page.getByRole('link', { name: 'Verwaltung' }).click(); + await page.getByLabel('Email').fill('admin2@test.de'); + await page.getByRole('button', { name: 'Freischalten' }).click(); + await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); + await expect(page.getByRole('cell', { name: 'admin2@test.de' })).toBeVisible(); }); test('Deactivate administrator', async ({ page }) => { - await login(page, ENTREPENEUR); - await page.getByRole('link', { name: 'Verwaltung' }).click(); - await page.waitForTimeout(200); - await page.getByRole('row', { name: 'admin2@test.de x' }).getByRole('button').click(); - await page.waitForTimeout(200); - await expect(page.getByRole('cell', { name: 'admin2@test.de' })).not.toBeVisible(); -}); \ No newline at end of file + await login(page, ENTREPENEUR); + await page.getByRole('link', { name: 'Verwaltung' }).click(); + await page.waitForTimeout(200); + await page.getByRole('row', { name: 'admin2@test.de x' }).getByRole('button').click(); + await page.waitForTimeout(200); + await expect(page.getByRole('cell', { name: 'admin2@test.de' })).not.toBeVisible(); +}); diff --git a/tests/moveTour.ts b/tests/moveTour.ts index ced30733..e05882b2 100644 --- a/tests/moveTour.ts +++ b/tests/moveTour.ts @@ -2,34 +2,34 @@ import { test, expect } from '@playwright/test'; import { addVehicle } from './utils'; test('Move tour to other vehicle', async ({ page }) => { - await addVehicle(page, 'GR-TU-12'); + await addVehicle(page, 'GR-TU-12'); - await page.goto('/taxi?offset=-120&date=2026-09-30'); - await page.waitForTimeout(1000); + await page.goto('/taxi?offset=-120&date=2026-09-30'); + await page.waitForTimeout(1000); - await expect( - page - .locator( - 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8' - ) - .first() - ).toHaveCSS('background-color', 'rgb(251, 146, 60)'); + await expect( + page + .locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8' + ) + .first() + ).toHaveCSS('background-color', 'rgb(251, 146, 60)'); - await page.mouse.move(425, 505); - await page.mouse.down(); - await page.mouse.move(425, 540); - await page.waitForTimeout(1000); - await page.mouse.up(); + await page.mouse.move(425, 505); + await page.mouse.down(); + await page.mouse.move(425, 540); + await page.waitForTimeout(1000); + await page.mouse.up(); - await expect( - page - .locator( - 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8' - ) - .first() - ).toHaveCSS('background-color', 'rgb(254, 249, 195)'); - await expect(page.locator('.cursor-pointer').first()).toHaveCSS( - 'background-color', - 'rgb(251, 146, 60)' - ); -}); \ No newline at end of file + await expect( + page + .locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8' + ) + .first() + ).toHaveCSS('background-color', 'rgb(254, 249, 195)'); + await expect(page.locator('.cursor-pointer').first()).toHaveCSS( + 'background-color', + 'rgb(251, 146, 60)' + ); +}); diff --git a/tests/redisposeTour.ts b/tests/redisposeTour.ts index bd2f6819..1586b546 100644 --- a/tests/redisposeTour.ts +++ b/tests/redisposeTour.ts @@ -1,19 +1,19 @@ -import { expect, test } from '@playwright/test'; +import { test } from '@playwright/test'; import { login, ENTREPENEUR } from './utils'; test('Redispose tour', async ({ page }) => { - await login(page, ENTREPENEUR); - await page.goto('/taxi?offset=-120&date=2026-09-30'); - await page.waitForTimeout(1000); + await login(page, ENTREPENEUR); + await page.goto('/taxi?offset=-120&date=2026-09-30'); + await page.waitForTimeout(1000); - await page - .locator('table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8') - .first() - .click(); - await page.getByText('Tour redisponieren').click(); - await page.getByText('Bestätigen').click(); - await page.getByText('Ok').click(); - await page.getByRole('button', { name: 'cross 2, Close' }).click(); + await page + .locator('table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8') + .first() + .click(); + await page.getByText('Tour redisponieren').click(); + await page.getByText('Bestätigen').click(); + await page.getByText('Ok').click(); + await page.getByRole('button', { name: 'cross 2, Close' }).click(); - // TODO: check -}); \ No newline at end of file + // TODO: check +}); diff --git a/tests/utils.ts b/tests/utils.ts index 42ec01a1..891dd160 100644 --- a/tests/utils.ts +++ b/tests/utils.ts @@ -59,7 +59,6 @@ export async function signup(page: Page, credentials: UserCredentials) { page.getByRole('heading', { name: 'Willkommen beim Projekt PrimaÖV!' }) ).toBeVisible(); await page.getByRole('link', { name: 'Logout' }).click(); - } export async function setCompanyData(page: Page, user: UserCredentials, company: Company) { From 08610da642c01d1aa2e778cc2639178af47242fe Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 11 Sep 2024 11:36:14 +0200 Subject: [PATCH 15/44] wip --- tests/utils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/utils.ts b/tests/utils.ts index 891dd160..c87def35 100644 --- a/tests/utils.ts +++ b/tests/utils.ts @@ -43,6 +43,7 @@ export const COMPANY2: Company = { export async function login(page: Page, credentials: UserCredentials) { await page.goto('/login'); + await page.waitForTimeout(500); await expect(page.getByRole('heading', { name: 'Login' })).toBeVisible(); await page.getByLabel('Email').fill(credentials.email); await page.getByLabel('Password').fill(credentials.password); From be442728019c8f9ae5244086375a8ff7ff5dce1d Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 11 Sep 2024 14:48:45 +0200 Subject: [PATCH 16/44] update E2E tests, timeouts, dependencies --- playwright.config.ts | 2 +- tests/availability.ts | 1 + tests/redisposeTour.ts | 5 ++--- tests/utils.ts | 6 +++++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/playwright.config.ts b/playwright.config.ts index 6f0b22a8..4ddf5574 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -48,7 +48,7 @@ export default defineConfig({ { name: 'resdispose tour', testMatch: /redisposeTour\.ts/, - dependencies: ['availability'] + dependencies: ['move tour'] } ] }); diff --git a/tests/availability.ts b/tests/availability.ts index 04105e0b..788ff0c9 100644 --- a/tests/availability.ts +++ b/tests/availability.ts @@ -34,6 +34,7 @@ export async function requestRide(page: Page) { await page.keyboard.press('ArrowRight'); await page.keyboard.down('A'); await page.getByRole('button', { name: 'Suchen' }).click(); + await page.waitForTimeout(500); await expect(page.getByRole('heading', { name: ': OK' })).toHaveText('200: OK'); } diff --git a/tests/redisposeTour.ts b/tests/redisposeTour.ts index 1586b546..32029596 100644 --- a/tests/redisposeTour.ts +++ b/tests/redisposeTour.ts @@ -4,11 +4,10 @@ import { login, ENTREPENEUR } from './utils'; test('Redispose tour', async ({ page }) => { await login(page, ENTREPENEUR); await page.goto('/taxi?offset=-120&date=2026-09-30'); - await page.waitForTimeout(1000); + await page.waitForTimeout(500); await page - .locator('table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8') - .first() + .locator('.cursor-pointer').first() .click(); await page.getByText('Tour redisponieren').click(); await page.getByText('Bestätigen').click(); diff --git a/tests/utils.ts b/tests/utils.ts index c87def35..5d528043 100644 --- a/tests/utils.ts +++ b/tests/utils.ts @@ -43,11 +43,11 @@ export const COMPANY2: Company = { export async function login(page: Page, credentials: UserCredentials) { await page.goto('/login'); - await page.waitForTimeout(500); await expect(page.getByRole('heading', { name: 'Login' })).toBeVisible(); await page.getByLabel('Email').fill(credentials.email); await page.getByLabel('Password').fill(credentials.password); await page.getByRole('button', { name: 'Login' }).click(); + await page.waitForTimeout(500); } export async function signup(page: Page, credentials: UserCredentials) { @@ -60,6 +60,7 @@ export async function signup(page: Page, credentials: UserCredentials) { page.getByRole('heading', { name: 'Willkommen beim Projekt PrimaÖV!' }) ).toBeVisible(); await page.getByRole('link', { name: 'Logout' }).click(); + await page.waitForTimeout(500); } export async function setCompanyData(page: Page, user: UserCredentials, company: Company) { @@ -72,11 +73,13 @@ export async function setCompanyData(page: Page, user: UserCredentials, company: await page.getByLabel('Pflichtfahrgebiet').selectOption({ label: company.zone }); await page.getByLabel('Gemeinde').selectOption({ label: company.community }); await page.getByRole('button', { name: 'Übernehmen' }).click(); + await page.waitForTimeout(500); } export async function addVehicle(page: Page, licensePlate: string) { await login(page, ENTREPENEUR); await page.goto('/company'); + await page.waitForTimeout(500); await page.getByRole('link', { name: 'Taxi' }).click(); await expect(page.getByRole('heading', { name: 'Fahrzeuge und Touren' })).toBeVisible(); await page.waitForTimeout(500); @@ -87,4 +90,5 @@ export async function addVehicle(page: Page, licensePlate: string) { .locator('button') .filter({ hasText: /^Fahrzeug hinzufügen$/ }) .click(); + await page.waitForTimeout(500); } From 00d51f5c149d2abd59ede384510cec4c7625bb7e Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 11 Sep 2024 14:53:55 +0200 Subject: [PATCH 17/44] format --- tests/redisposeTour.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/redisposeTour.ts b/tests/redisposeTour.ts index 32029596..9e634b7f 100644 --- a/tests/redisposeTour.ts +++ b/tests/redisposeTour.ts @@ -6,9 +6,7 @@ test('Redispose tour', async ({ page }) => { await page.goto('/taxi?offset=-120&date=2026-09-30'); await page.waitForTimeout(500); - await page - .locator('.cursor-pointer').first() - .click(); + await page.locator('.cursor-pointer').first().click(); await page.getByText('Tour redisponieren').click(); await page.getByText('Bestätigen').click(); await page.getByText('Ok').click(); From 4422ccdf18ab6214bfc633fb07166ad9ce732611 Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 11 Sep 2024 15:51:53 +0200 Subject: [PATCH 18/44] wip --- .eslintignore | 2 ++ .prettierignore | 2 ++ tests/availability.ts | 74 ++++++++++++++++++++++++++++++++++++++++-- tests/redisposeTour.ts | 2 -- 4 files changed, 75 insertions(+), 5 deletions(-) diff --git a/.eslintignore b/.eslintignore index 38972655..2daeae55 100644 --- a/.eslintignore +++ b/.eslintignore @@ -11,3 +11,5 @@ node_modules pnpm-lock.yaml package-lock.json yarn.lock + +taxidriver-android-app diff --git a/.prettierignore b/.prettierignore index adca5042..d291286a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,3 +5,5 @@ yarn.lock src/lib/components/* .github/* migrations/* + +taxidriver-android-app diff --git a/tests/availability.ts b/tests/availability.ts index 788ff0c9..2ac13edc 100644 --- a/tests/availability.ts +++ b/tests/availability.ts @@ -46,15 +46,83 @@ test('Set company data', async ({ page }) => { test('Add vehicle', async ({ page }) => { await addVehicle(page, 'GR-TU-11'); - // TODO: check + await expect(page.getByRole('cell', { name: 'GR-TU-11' }).first()).toBeVisible(); }); test('Set availability', async ({ page }) => { await setAvailability(page); - // TODO: check + await expect( + page.locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(3) > .w-full > tbody > tr > td:nth-child(4) > .w-8' + ) + ).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)'); + await expect( + page + .locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8' + ) + .first() + ).toHaveCSS('background-color', 'rgb(254, 249, 195)'); + await expect( + page.locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(2) > .w-8' + ) + ).toHaveCSS('background-color', 'rgb(254, 249, 195)'); + await expect( + page.locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(3) > .w-8' + ) + ).toHaveCSS('background-color', 'rgb(254, 249, 195)'); + await expect( + page.locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(4) > .w-8' + ) + ).toHaveCSS('background-color', 'rgb(254, 249, 195)'); + await expect( + page + .locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(5) > .w-full > tbody > tr > td > .w-8' + ) + .first() + ).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)'); }); test('Request ride', async ({ page }) => { await requestRide(page); - // TODO: check + await page.goto('/taxi?offset=-120&date=2026-09-30'); + await page.waitForTimeout(500); + await expect( + page.locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(3) > .w-full > tbody > tr > td:nth-child(4) > .w-8' + ) + ).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)'); + await expect( + page + .locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td > .w-8' + ) + .first() + ).toHaveCSS('background-color', 'rgb(251, 146, 60)'); + await expect( + page.locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(2) > .w-8' + ) + ).toHaveCSS('background-color', 'rgb(251, 146, 60)'); + await expect( + page.locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(3) > .w-8' + ) + ).toHaveCSS('background-color', 'rgb(251, 146, 60)'); + await expect( + page.locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(4) > .w-full > tbody > tr > td:nth-child(4) > .w-8' + ) + ).toHaveCSS('background-color', 'rgb(254, 249, 195)'); + await expect( + page + .locator( + 'table:nth-child(2) > tbody > tr > td:nth-child(5) > .w-full > tbody > tr > td > .w-8' + ) + .first() + ).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)'); }); diff --git a/tests/redisposeTour.ts b/tests/redisposeTour.ts index 9e634b7f..6e0dca63 100644 --- a/tests/redisposeTour.ts +++ b/tests/redisposeTour.ts @@ -11,6 +11,4 @@ test('Redispose tour', async ({ page }) => { await page.getByText('Bestätigen').click(); await page.getByText('Ok').click(); await page.getByRole('button', { name: 'cross 2, Close' }).click(); - - // TODO: check }); From ff5d5823a40415156c964016d27f925c2b33d249 Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 11 Sep 2024 16:07:58 +0200 Subject: [PATCH 19/44] remove contradicting migrations --- migrations/2024-08-23-1.js | 15 --------------- migrations/2024-09-11-0.js | 15 --------------- 2 files changed, 30 deletions(-) delete mode 100644 migrations/2024-08-23-1.js delete mode 100644 migrations/2024-09-11-0.js diff --git a/migrations/2024-08-23-1.js b/migrations/2024-08-23-1.js deleted file mode 100644 index babc010e..00000000 --- a/migrations/2024-08-23-1.js +++ /dev/null @@ -1,15 +0,0 @@ -export async function up(db) { - await db.schema - .alterTable('auth_user') - .addColumn('is_driver', 'boolean', (col) => - col.notNull().defaultTo(false), - ) - .execute(); -} - -export async function down(db) { - await db.schema - .alterTable('auth_user') - .dropColumn('is_driver') - .execute(); -} \ No newline at end of file diff --git a/migrations/2024-09-11-0.js b/migrations/2024-09-11-0.js deleted file mode 100644 index ccd73deb..00000000 --- a/migrations/2024-09-11-0.js +++ /dev/null @@ -1,15 +0,0 @@ -export async function up(db) { - await db.schema - .alterTable('auth_user') - .dropColumn('is_driver') - .execute(); -} - -export async function down(db) { - await db.schema - .alterTable('auth_user') - .addColumn('is_driver', 'boolean', (col) => - col.notNull().defaultTo(false), - ) - .execute(); -} From f971ecf3de49ad8abaecf072a6bc6a52b91c3d38 Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Fri, 13 Sep 2024 14:38:21 +0200 Subject: [PATCH 20/44] wip --- playwright.config.ts | 29 ++++++++++++----------------- src/routes/request/+page.svelte | 4 ++-- tests/availability.ts | 21 +++------------------ tests/moveTour.ts | 2 +- tests/redisposeTour.ts | 14 -------------- 5 files changed, 18 insertions(+), 52 deletions(-) delete mode 100644 tests/redisposeTour.ts diff --git a/playwright.config.ts b/playwright.config.ts index 4ddf5574..71103d39 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,24 +1,24 @@ import { defineConfig } from '@playwright/test'; export default defineConfig({ // test for development version + webServer: { + command: 'while true; do npm run dev; done', + url: 'http://localhost:5173', + timeout: 20000, + reuseExistingServer: true + }, + use: { + baseURL: 'http://localhost:5173/' + }, // webServer: { - // command: 'while true; do npm run dev; done', - // url: 'http://localhost:5173', + // command: 'docker compose up prima', + // url: 'http://127.0.0.1:8080', // timeout: 10000, // reuseExistingServer: true // }, // use: { - // baseURL: 'http://localhost:5173/' + // baseURL: 'http://localhost:8080/' // }, - webServer: { - command: 'docker compose up prima', - url: 'http://127.0.0.1:8080', - timeout: 10000, - reuseExistingServer: true - }, - use: { - baseURL: 'http://localhost:8080/' - }, testDir: './tests', projects: [ { @@ -44,11 +44,6 @@ export default defineConfig({ name: 'move tour', testMatch: /moveTour\.ts/, dependencies: ['availability'] - }, - { - name: 'resdispose tour', - testMatch: /redisposeTour\.ts/, - dependencies: ['move tour'] } ] }); diff --git a/src/routes/request/+page.svelte b/src/routes/request/+page.svelte index b1f7f690..03ddb479 100644 --- a/src/routes/request/+page.svelte +++ b/src/routes/request/+page.svelte @@ -168,7 +168,7 @@ }); let timeType = $state('departure'); - let dateTime = $state(new Date()); + let dateTime = $state(new Date().toISOString()); let arriveBy = $derived(timeType === 'arrival'); let bookingResponse = $state>>([]); @@ -251,7 +251,7 @@
- +
diff --git a/tests/entrepreneurAssignsRoles.ts b/tests/entrepreneurAssignsRoles.ts index 3d96d321..7cef444f 100644 --- a/tests/entrepreneurAssignsRoles.ts +++ b/tests/entrepreneurAssignsRoles.ts @@ -3,30 +3,40 @@ import { ENTREPENEUR, setCompanyData, signup, COMPANY1, login } from './utils'; test.describe.configure({ mode: 'serial' }); -test('Activate driver', async ({ page }) => { - await signup(page, { email: 'driver@test.de', password: 'longEnough3' }); +test('Activate drivers', async ({ page }) => { + await signup(page, { email: 'driver1@test.de', password: 'longEnough2' }); + await signup(page, { email: 'driver2@test.de', password: 'longEnough2' }); await setCompanyData(page, ENTREPENEUR, COMPANY1); + await page.getByRole('link', { name: 'Fahrer' }).click(); - await page.getByLabel('Email').fill('driver@test.de'); + await page.getByPlaceholder('Email').fill('driver1@test.de'); + await page.getByRole('button', { name: 'Freischalten' }).click(); + await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); + await expect(page.getByRole('cell', { name: 'driver1@test.de' })).toHaveText('driver1@test.de'); + + await page.reload(); + await expect(page.getByRole('cell', { name: 'driver1@test.de' })).toHaveText('driver1@test.de'); + await page.getByPlaceholder('Email').fill('driver2@test.de'); await page.getByRole('button', { name: 'Freischalten' }).click(); await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); - await expect(page.getByRole('cell', { name: 'driver@test.de' })).toHaveText('driver@test.de'); + await expect(page.getByRole('cell', { name: 'driver2@test.de' })).toHaveText('driver2@test.de'); }); test('Deactivate driver', async ({ page }) => { await login(page, ENTREPENEUR); await page.getByRole('link', { name: 'Fahrer' }).click(); - await page.waitForTimeout(100); - await page.getByRole('button', { name: 'x' }).click(); - await page.waitForTimeout(100); - await expect(page.getByRole('cell', { name: 'driver@test.de' })).not.toBeVisible(); + await page + .getByRole('row', { name: 'driver2@test.de Zugang zum Unternehmen löschen' }) + .getByRole('button') + .click(); + await expect(page.getByRole('cell', { name: 'driver2@test.de' })).not.toBeVisible(); }); test('Activate administrator', async ({ page }) => { await signup(page, { email: 'admin2@test.de', password: 'longEnough3' }); await setCompanyData(page, ENTREPENEUR, COMPANY1); await page.getByRole('link', { name: 'Verwaltung' }).click(); - await page.getByLabel('Email').fill('admin2@test.de'); + await page.getByPlaceholder('Email').fill('admin2@test.de'); await page.getByRole('button', { name: 'Freischalten' }).click(); await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); await expect(page.getByRole('cell', { name: 'admin2@test.de' })).toBeVisible(); @@ -35,8 +45,9 @@ test('Activate administrator', async ({ page }) => { test('Deactivate administrator', async ({ page }) => { await login(page, ENTREPENEUR); await page.getByRole('link', { name: 'Verwaltung' }).click(); - await page.waitForTimeout(100); - await page.getByRole('row', { name: 'admin2@test.de x' }).getByRole('button').click(); - await page.waitForTimeout(100); + await page + .getByRole('row', { name: 'admin2@test.de Zugang zum Unternehmen löschen' }) + .getByRole('button') + .click(); await expect(page.getByRole('cell', { name: 'admin2@test.de' })).not.toBeVisible(); }); From 1d6af0414507b0df7d8eafbeb18377fd895f6f1a Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Tue, 17 Sep 2024 16:22:48 +0200 Subject: [PATCH 36/44] wip --- src/routes/(user)/administration/+page.server.ts | 1 - tests/entrepreneurAssignsRoles.ts | 14 +++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/routes/(user)/administration/+page.server.ts b/src/routes/(user)/administration/+page.server.ts index 05fb81a3..9db042a8 100644 --- a/src/routes/(user)/administration/+page.server.ts +++ b/src/routes/(user)/administration/+page.server.ts @@ -38,7 +38,6 @@ export const actions = { } return { updated: true }; }, - revoke: async (event: RequestEvent) => { const email = (await event.request.formData()).get('email')!.toString(); if (event.locals.user!.email == email) { diff --git a/tests/entrepreneurAssignsRoles.ts b/tests/entrepreneurAssignsRoles.ts index 7cef444f..a0ff57b7 100644 --- a/tests/entrepreneurAssignsRoles.ts +++ b/tests/entrepreneurAssignsRoles.ts @@ -33,21 +33,29 @@ test('Deactivate driver', async ({ page }) => { }); test('Activate administrator', async ({ page }) => { - await signup(page, { email: 'admin2@test.de', password: 'longEnough3' }); + await signup(page, { email: 'admin2@test.de', password: 'longEnough2' }); + await signup(page, { email: 'admin3@test.de', password: 'longEnough2' }); await setCompanyData(page, ENTREPENEUR, COMPANY1); + await page.getByRole('link', { name: 'Verwaltung' }).click(); await page.getByPlaceholder('Email').fill('admin2@test.de'); await page.getByRole('button', { name: 'Freischalten' }).click(); await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); await expect(page.getByRole('cell', { name: 'admin2@test.de' })).toBeVisible(); + + await page.reload(); + await page.getByPlaceholder('Email').fill('admin3@test.de'); + await page.getByRole('button', { name: 'Freischalten' }).click(); + await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); + await expect(page.getByRole('cell', { name: 'admin3@test.de' })).toBeVisible(); }); test('Deactivate administrator', async ({ page }) => { await login(page, ENTREPENEUR); await page.getByRole('link', { name: 'Verwaltung' }).click(); await page - .getByRole('row', { name: 'admin2@test.de Zugang zum Unternehmen löschen' }) + .getByRole('row', { name: 'admin3@test.de Zugang zum Unternehmen löschen' }) .getByRole('button') .click(); - await expect(page.getByRole('cell', { name: 'admin2@test.de' })).not.toBeVisible(); + await expect(page.getByRole('cell', { name: 'admin3@test.de' })).not.toBeVisible(); }); From 5a7e1d3dee29c4648d714d2a1656db785cd7e37a Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Tue, 17 Sep 2024 16:34:34 +0200 Subject: [PATCH 37/44] wip --- src/routes/(user)/administration/+page.server.ts | 4 ++++ tests/entrepreneurAssignsRoles.ts | 1 + 2 files changed, 5 insertions(+) diff --git a/src/routes/(user)/administration/+page.server.ts b/src/routes/(user)/administration/+page.server.ts index 9db042a8..7b25b2da 100644 --- a/src/routes/(user)/administration/+page.server.ts +++ b/src/routes/(user)/administration/+page.server.ts @@ -32,6 +32,10 @@ export const actions = { .where('email', '=', email) .where('is_entrepreneur', '=', false) .where('is_maintainer', '=', false) + .where((eb) => eb.or([ + eb('company_id', 'is', null), + eb('company_id', '=', companyId) + ])) .executeTakeFirstOrThrow(); if (numUpdatedRows == BigInt(0)) { return fail(400, { email, incorrect: true }); diff --git a/tests/entrepreneurAssignsRoles.ts b/tests/entrepreneurAssignsRoles.ts index a0ff57b7..880e86a8 100644 --- a/tests/entrepreneurAssignsRoles.ts +++ b/tests/entrepreneurAssignsRoles.ts @@ -9,6 +9,7 @@ test('Activate drivers', async ({ page }) => { await setCompanyData(page, ENTREPENEUR, COMPANY1); await page.getByRole('link', { name: 'Fahrer' }).click(); + await page.waitForTimeout(200); await page.getByPlaceholder('Email').fill('driver1@test.de'); await page.getByRole('button', { name: 'Freischalten' }).click(); await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); From b0bad3e0c33a654312dcf1d24b2d28fab1ddd7da Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Tue, 17 Sep 2024 16:35:46 +0200 Subject: [PATCH 38/44] wip --- src/routes/(user)/administration/+page.server.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/routes/(user)/administration/+page.server.ts b/src/routes/(user)/administration/+page.server.ts index 7b25b2da..f7a22984 100644 --- a/src/routes/(user)/administration/+page.server.ts +++ b/src/routes/(user)/administration/+page.server.ts @@ -32,10 +32,7 @@ export const actions = { .where('email', '=', email) .where('is_entrepreneur', '=', false) .where('is_maintainer', '=', false) - .where((eb) => eb.or([ - eb('company_id', 'is', null), - eb('company_id', '=', companyId) - ])) + .where((eb) => eb.or([eb('company_id', 'is', null), eb('company_id', '=', companyId)])) .executeTakeFirstOrThrow(); if (numUpdatedRows == BigInt(0)) { return fail(400, { email, incorrect: true }); From e9b5a4dd8f03f9fd613e61310a332e296a935df2 Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 18 Sep 2024 10:08:21 +0200 Subject: [PATCH 39/44] wip --- tests/entrepreneurAssignsRoles.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/entrepreneurAssignsRoles.ts b/tests/entrepreneurAssignsRoles.ts index 880e86a8..d1dbb3a0 100644 --- a/tests/entrepreneurAssignsRoles.ts +++ b/tests/entrepreneurAssignsRoles.ts @@ -7,9 +7,9 @@ test('Activate drivers', async ({ page }) => { await signup(page, { email: 'driver1@test.de', password: 'longEnough2' }); await signup(page, { email: 'driver2@test.de', password: 'longEnough2' }); await setCompanyData(page, ENTREPENEUR, COMPANY1); - + await login(page, ENTREPENEUR); await page.getByRole('link', { name: 'Fahrer' }).click(); - await page.waitForTimeout(200); + await page.waitForTimeout(5000); await page.getByPlaceholder('Email').fill('driver1@test.de'); await page.getByRole('button', { name: 'Freischalten' }).click(); await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); From 4df1f3c9582adbb738f932f485988338bfcbfd1e Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 18 Sep 2024 10:13:59 +0200 Subject: [PATCH 40/44] test --- playwright.config.ts | 30 +++++++++++++++--------------- tests/entrepreneurAssignsRoles.ts | 2 -- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/playwright.config.ts b/playwright.config.ts index 1265f8db..16d3a7ca 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -34,20 +34,20 @@ export default defineConfig({ testMatch: 'login.setup.ts', dependencies: ['setup db'] }, - { - name: 'entrepreneurAssignsRoles', - testMatch: 'entrepreneurAssignsRoles.ts', - dependencies: ['login'] - }, - { - name: 'availability', - testMatch: 'availability.ts', - dependencies: ['login'] - }, - { - name: 'move tour', - testMatch: 'moveTour.ts', - dependencies: ['availability'] - } + // { + // name: 'entrepreneurAssignsRoles', + // testMatch: 'entrepreneurAssignsRoles.ts', + // dependencies: ['login'] + // }, + // { + // name: 'availability', + // testMatch: 'availability.ts', + // dependencies: ['login'] + // }, + // { + // name: 'move tour', + // testMatch: 'moveTour.ts', + // dependencies: ['availability'] + // } ] }); diff --git a/tests/entrepreneurAssignsRoles.ts b/tests/entrepreneurAssignsRoles.ts index d1dbb3a0..abbfd133 100644 --- a/tests/entrepreneurAssignsRoles.ts +++ b/tests/entrepreneurAssignsRoles.ts @@ -7,9 +7,7 @@ test('Activate drivers', async ({ page }) => { await signup(page, { email: 'driver1@test.de', password: 'longEnough2' }); await signup(page, { email: 'driver2@test.de', password: 'longEnough2' }); await setCompanyData(page, ENTREPENEUR, COMPANY1); - await login(page, ENTREPENEUR); await page.getByRole('link', { name: 'Fahrer' }).click(); - await page.waitForTimeout(5000); await page.getByPlaceholder('Email').fill('driver1@test.de'); await page.getByRole('button', { name: 'Freischalten' }).click(); await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); From 68583cfe591ac1da77f9d2326db83b24be7d2eef Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 18 Sep 2024 10:16:13 +0200 Subject: [PATCH 41/44] test --- playwright.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playwright.config.ts b/playwright.config.ts index 16d3a7ca..162850bb 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -33,7 +33,7 @@ export default defineConfig({ name: 'login', testMatch: 'login.setup.ts', dependencies: ['setup db'] - }, + } // { // name: 'entrepreneurAssignsRoles', // testMatch: 'entrepreneurAssignsRoles.ts', From 092380af63fc0087f739fc66ebb5a70214378b15 Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 18 Sep 2024 10:19:31 +0200 Subject: [PATCH 42/44] test --- playwright.config.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/playwright.config.ts b/playwright.config.ts index 162850bb..10c3bfb0 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -33,13 +33,13 @@ export default defineConfig({ name: 'login', testMatch: 'login.setup.ts', dependencies: ['setup db'] + }, + { + name: 'entrepreneurAssignsRoles', + testMatch: 'entrepreneurAssignsRoles.ts', + dependencies: ['login'] } // { - // name: 'entrepreneurAssignsRoles', - // testMatch: 'entrepreneurAssignsRoles.ts', - // dependencies: ['login'] - // }, - // { // name: 'availability', // testMatch: 'availability.ts', // dependencies: ['login'] From a74f24db4c666f28cccbd5b9279f10eeaa3166ca Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 18 Sep 2024 11:11:12 +0200 Subject: [PATCH 43/44] test --- tests/entrepreneurAssignsRoles.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/entrepreneurAssignsRoles.ts b/tests/entrepreneurAssignsRoles.ts index abbfd133..971ffa14 100644 --- a/tests/entrepreneurAssignsRoles.ts +++ b/tests/entrepreneurAssignsRoles.ts @@ -8,6 +8,7 @@ test('Activate drivers', async ({ page }) => { await signup(page, { email: 'driver2@test.de', password: 'longEnough2' }); await setCompanyData(page, ENTREPENEUR, COMPANY1); await page.getByRole('link', { name: 'Fahrer' }).click(); + await expect(page.getByRole('heading', { name: 'Fahrer Zugang' })).toBeVisible(); await page.getByPlaceholder('Email').fill('driver1@test.de'); await page.getByRole('button', { name: 'Freischalten' }).click(); await expect(page.getByText('Freischaltung erfolgreich!')).toBeVisible(); From b883ac0d2de9f42405f5fe003d99f622045a0d85 Mon Sep 17 00:00:00 2001 From: Steffen Heger Date: Wed, 18 Sep 2024 11:15:33 +0200 Subject: [PATCH 44/44] test --- playwright.config.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/playwright.config.ts b/playwright.config.ts index 10c3bfb0..1265f8db 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -38,16 +38,16 @@ export default defineConfig({ name: 'entrepreneurAssignsRoles', testMatch: 'entrepreneurAssignsRoles.ts', dependencies: ['login'] + }, + { + name: 'availability', + testMatch: 'availability.ts', + dependencies: ['login'] + }, + { + name: 'move tour', + testMatch: 'moveTour.ts', + dependencies: ['availability'] } - // { - // name: 'availability', - // testMatch: 'availability.ts', - // dependencies: ['login'] - // }, - // { - // name: 'move tour', - // testMatch: 'moveTour.ts', - // dependencies: ['availability'] - // } ] });