feat(projekter): en deling siger til, og der er en vej ud af den
Spørgsmålet var, om modtageren ikke burde godkende først. Svaret er nej — men det, spørgsmålet fik øje på, var rigtigt, og værre end det lød. Tre ting gjaldt samtidig: man blev tilføjet uden at blive spurgt, man fik ikke besked, og man kunne ikke gå ud igen. En delt note gav en klokkebesked; et delt projekt gav ingenting — det stod bare i sidebjælken næste gang, man kiggede, uden at noget sagde hvornår eller fra hvem. Og handleRemoveMember lå bag ejer-kravet, så kun ejeren kunne fjerne nogen, også en selv. Hvert enkelt af de tre er til at leve med. Alle tre sammen gør en deling til noget, der sker for en. Ikke et godkendelsestrin: en invitation, der venter på et ja, betyder, at den, der delte, tror det er gjort, mens arbejdet ligger stille — og noter deles allerede uden. Det, der manglede, var besked og en udgang. `project.shared` er ny. Klokkens follow() kunne allerede føre et project_id hen til projektet, så beskeden bærer sit eget mål og krævede ingen særregel. Ruten til at fjerne et medlem er flyttet ud af ejer-gruppen, og handleren skiller nu de to ting ad: ejeren, der fjerner nogen, og den, der selv går. At pege på en andens medlemskab uden at eje projektet svarer 404 og ikke 403 — "det må du ikke" bekræfter, at medlemskabet findes. Ejeren kan stadig ikke gå fra sit eget projekt; det ville være en overdragelse, og den findes ikke endnu. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
0f4048d8f2
commit
7f09b35db5
@@ -4597,5 +4597,41 @@ test('et projekt kan deles med en, der allerede har en konto', async ({ browser,
|
||||
// spring tilbage til det første projekt, og delingspanelet står åbent på tværs
|
||||
// af det spring — så klikket på "Del" lukkede det, jeg lige havde åbnet.
|
||||
|
||||
// Og så den anden vej: hvad Gartner selv oplever. Man bliver lukket ind i et
|
||||
// projekt uden at blive spurgt, så man skal i det mindste få det at vide og
|
||||
// kunne gå ud igen uden at bede ejeren om lov.
|
||||
const theirs = await browser.newContext({ storageState: { cookies: [], origins: [] } });
|
||||
const gartner = await theirs.newPage();
|
||||
const gartnerTrouble = watchForTrouble(gartner);
|
||||
await gartner.goto('/');
|
||||
await gartner.getByLabel('E-mail').fill('gartner@example.dk');
|
||||
await gartner.getByLabel('Adgangskode').fill('et langt kodeord til test');
|
||||
await gartner.getByRole('button', { name: 'Log ind' }).click();
|
||||
await expect(gartner.getByRole('navigation', { name: 'Hovedmenu' })).toBeVisible();
|
||||
|
||||
await gartner.getByRole('button', { name: /Beskeder/ }).click();
|
||||
const bell = gartner.getByRole('dialog', { name: 'Beskeder' });
|
||||
await expect(bell.getByText('delte et projekt med dig')).toBeVisible();
|
||||
|
||||
// Beskeden fører hen til projektet. En besked, der ikke kan følges, er en
|
||||
// oplysning om noget, man selv skal gå ud og finde.
|
||||
await bell.locator('.row').filter({ hasText: 'delte et projekt med dig' }).click();
|
||||
await expect(gartner.getByRole('heading', { name: 'Drivhuset' })).toBeVisible();
|
||||
|
||||
// Udgangen. Bekræftelsen siges ja til, ellers sker der intet.
|
||||
gartner.on('dialog', (d) => d.accept());
|
||||
await projectAction(gartner, /^Del/);
|
||||
await gartner.getByRole('button', { name: 'Forlad projektet' }).click();
|
||||
|
||||
// Væk fra sidebjælken, og ikke længere til at åbne.
|
||||
await expect(
|
||||
gartner.getByRole('navigation', { name: 'Hovedmenu' }).getByRole('link', { name: /Drivhuset/ })
|
||||
).toHaveCount(0);
|
||||
|
||||
// En 404 her er ikke uro: den er svaret på at bede om et projekt, man lige har
|
||||
// forladt, og den er hele pointen med at have forladt det.
|
||||
expect(gartnerTrouble.filter((t) => !t.includes('404'))).toEqual([]);
|
||||
await theirs.close();
|
||||
|
||||
expect(trouble).toEqual([]);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user