review access: guest-play apps rejected by Play as a login wall (empty name field, disabled Continue, a code link on the first screen): check warns for a Play app with a first-run gate or IAP and no reviewAccess.instructions; with guest steps the play-sign-in-details plan declares one entry without credentials, the dialog's required full-access box as the owner's step; store-pitfalls 73

This commit is contained in:
CRTkafa 2026-10-17 12:50:06 +08:00
parent d6070cc185
commit 824758179b
11 changed files with 202 additions and 15 deletions

View file

@ -185,11 +185,11 @@ describe('agent-only Play plans: shape, URLs, never-press lists, the owner batch
// in .storebound/credentials.json: the agent types it, never printed (no value in the plan)
expect(cred).toMatchObject({ status: 'certain', value: null, action: 'type', text: 'from .storebound/credentials.json (never printed)' });
expect(cred.note).toContain('reviewDemoAccount: present');
expect(p.ownerBatch.map(o => o.kind)).toEqual(['final']);
expect(p.ownerBatch.map(o => o.kind)).toEqual(['agreement', 'final']);
// kept out of .storebound: the owner types it (in the owner batch, before the run)
const own = consolePlan('play-sign-in-details', { ...base, reviewAccess: { signInRequired: true, instructions: 'Sign in with the demo account.' } } as ShipConfig, { demoAccount: false });
expect(own.answers.find(a => a.id === 'credentials')).toMatchObject({ status: 'ask-owner', value: null });
expect(own.ownerBatch.map(o => [o.when, o.kind])).toEqual([['before', 'credentials'], ['after', 'final']]);
expect(own.ownerBatch.map(o => [o.when, o.kind])).toEqual([['before', 'credentials'], ['after', 'agreement'], ['after', 'final']]);
expect(JSON.stringify(own)).not.toMatch(/password"\s*:/i);
expect(consolePlan('play-sign-in-details', base).answers.map(a => a.status)).toEqual(['ask-owner']);
});