play data-safety: PSL_SUPPORT_DATA_DELETION_BY_USER as Play's single choice (partialDeletion true | false | 'auto90'), drop the removed PSL_DATA_COLLECTION_USER_REQUEST_DELETE (deletionRequest deprecated, check notes it); ship Google's empty form (cli/data/play-data-safety-form.csv, exported 2026-10-12), take every Answer requirement from it and report pairs not in it (formPairIssues) in check, declarations and play data-safety. Pitfall 21
This commit is contained in:
parent
dfc28c15f8
commit
b5b8f2da9d
35 changed files with 1824 additions and 859 deletions
|
|
@ -141,15 +141,15 @@ describe('review access and demo account', () => {
|
|||
|
||||
describe('profile checks (offline)', () => {
|
||||
test('accounts need a deletion URL and consistent Data safety; sign-in needs a demo account; subscriptions need terms', () => {
|
||||
const ds = { collectsData: true, encryptedInTransit: true, deletionRequest: false, data: {} };
|
||||
const ds = { collectsData: true, encryptedInTransit: true, data: {} };
|
||||
const msgs = profileIssues(base({ accounts: { enabled: true }, reviewAccess: { signInRequired: true }, dataSafety: ds,
|
||||
subscriptions: [group([sub()])] }), { demoAccount: false });
|
||||
const text = msgs.map(m => `${m.level} ${m.msg}`).join('\n');
|
||||
for (const m of ['error accounts.enabled: set accounts.deletionUrl', 'warn accounts.enabled: set accounts.inApp', 'PSL_ACM_NONE', 'deletionRequest is false',
|
||||
for (const m of ['error accounts.enabled: set accounts.deletionUrl', 'warn accounts.enabled: set accounts.inApp', 'PSL_ACM_NONE',
|
||||
'error App Review needs a demo account', 'error subscriptions: set app.termsUrl', 'without reviewScreenshot']) expect(text).toContain(m);
|
||||
expect(profileIssues(base({ app: { ...APP, termsUrl: 'https://example.com/t' }, accounts: { enabled: true, deletionUrl: 'https://example.com/d', inApp: 'Settings' },
|
||||
reviewAccess: { signInRequired: true, instructions: 'x' }, subscriptions: [group([sub({ reviewScreenshot: 'p.png' })])],
|
||||
dataSafety: { ...ds, deletionRequest: true, accountCreation: ['PSL_ACM_USER_ID_PASSWORD'] } }), { demoAccount: true })).toEqual([]);
|
||||
dataSafety: { ...ds, accountCreation: ['PSL_ACM_USER_ID_PASSWORD'] } }), { demoAccount: true })).toEqual([]);
|
||||
});
|
||||
test('profileRules (validate): Play needs a reachable delete-account page, Apple needs the demo account on App Review, terms linked', () => {
|
||||
const ok = { url: 'https://example.com/d', status: 200 };
|
||||
|
|
@ -388,10 +388,10 @@ describe('app screenshot style, data safety extras, tools, skills', () => {
|
|||
expect(readFileSync(join(ROOT, 'cli', 'shots', 'template-app.html'), 'utf8')).not.toContain('class="spark"');
|
||||
});
|
||||
test('Data safety extra rows are appended as given', () => {
|
||||
const rows = dataSafetyRows({ collectsData: true, encryptedInTransit: true, deletionRequest: true, accountCreation: ['PSL_ACM_USER_ID_PASSWORD'], data: {},
|
||||
const rows = dataSafetyRows({ collectsData: true, encryptedInTransit: true, accountCreation: ['PSL_ACM_USER_ID_PASSWORD'], data: {},
|
||||
extra: [{ question: 'PSL_EXAMPLE_URL', value: 'https://example.com/delete-account' }] });
|
||||
expect(rows.at(-1)).toEqual(['PSL_EXAMPLE_URL', '', 'https://example.com/delete-account', 'MAYBE_REQUIRED', 'PSL_EXAMPLE_URL']);
|
||||
expect(validateConfig(base({ dataSafety: { collectsData: true, encryptedInTransit: true, deletionRequest: true, data: {}, extra: [{ question: 'bad id', value: 'x' }] } })).join()).toContain('dataSafety.extra[0]');
|
||||
expect(validateConfig(base({ dataSafety: { collectsData: true, encryptedInTransit: true, data: {}, extra: [{ question: 'bad id', value: 'x' }] } })).join()).toContain('dataSafety.extra[0]');
|
||||
});
|
||||
test('MCP: subscriptions are dry-run write tools, catalog diff is read-only', () => {
|
||||
const t = (n: string) => TOOLS.find(x => x.name === n)!;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue