fix(ui): support legacy prompts and publication confirmation

This commit is contained in:
john
2026-07-14 15:05:37 +08:00
parent 77f1ea8350
commit f2d0c99f6c
5 changed files with 105 additions and 1 deletions
+66
View File
@@ -34,6 +34,72 @@ test('accepts all documented access modes', () => {
);
});
test('getCurrent exposes whether the owner confirmed publication visibility', async () => {
const service = createPublicationService({
async query(sql, params) {
assert.match(sql, /SELECT pr\.\*/);
assert.deepEqual(params, ['page-1', 'user-1']);
return [[{
id: 'pub-1',
page_id: 'page-1',
page_version_id: 'version-1',
url_slug: 'journal',
public_url: '/u/john/pages/journal',
access_mode: 'public',
expires_at: null,
status: 'online',
view_count: 2,
published_at: 1000,
offline_at: null,
user_confirmed_at: 2000,
}]];
},
});
const publication = await service.getCurrent('user-1', 'page-1');
assert.equal(publication.userConfirmedAt, 2000);
});
test('getCurrent returns null confirmation for an unconfirmed publication', async () => {
const service = createPublicationService({
async query() {
return [[{
id: 'pub-1',
page_id: 'page-1',
page_version_id: 'version-1',
url_slug: 'journal',
public_url: '/u/john/pages/journal',
access_mode: 'public',
expires_at: null,
status: 'online',
view_count: 0,
published_at: 1000,
offline_at: null,
user_confirmed_at: null,
}]];
},
});
const publication = await service.getCurrent('user-1', 'page-1');
assert.equal(publication.userConfirmedAt, null);
});
test('cleanupExpiredUnconfirmedPublications falls back to owner-only access', async () => {
let executedSql = '';
const service = createPublicationService({
async query(sql, params) {
executedSql = sql;
assert.deepEqual(params, [3000, 3000]);
return [{ affectedRows: 1 }];
},
});
const result = await service.cleanupExpiredUnconfirmedPublications(3000);
assert.deepEqual(result, { cleaned: 1 });
assert.match(executedSql, /SET access_mode = 'owner_only'/);
assert.doesNotMatch(executedSql, /SET access_mode = 'private'/);
});
test('hashes access passwords with a random salt', () => {
const first = publicationInternals.hashPassword('Publish-Password-2026');
const second = publicationInternals.hashPassword('Publish-Password-2026');