const assert = require('node:assert/strict'); const fs = require('node:fs'); const path = require('node:path'); const test = require('node:test'); const root = path.resolve(__dirname, '../..'); const read = (file) => fs.readFileSync(path.join(root, file), 'utf8'); test('modal and sign page use one renderer and one state machine', () => { const modal = read('templates/parts/modal-auth.php'); const page = read('templates/pages/page-sign.php'); const shared = read('templates/parts/auth-content.php'); const scripts = read('src/Core/ScriptsPart1c.php'); const runtime = read('assets/js/runtime/main.js') + read('assets/js/runtime/main.min.js'); const loader = read('assets/js/runtime/loader.js'); assert.match(modal, /templates\/parts\/auth-content\.php/); assert.match(page, /templates\/parts\/auth-content\.php/); assert.match(shared, /data-auth-panel="signin"/); assert.match(shared, /data-auth-panel="signup"/); assert.match(shared, /data-auth-panel="resetpassword"/); assert.match(shared, /data-auth-panel="bind"/); assert.match(shared, /data-auth-panel="oauth"/); assert.match(scripts, /assets\/js\/auth\.js/); assert.match(scripts, /'aksrt-notyf', 'aksrt-runtime'/); assert.doesNotMatch(scripts, /modal-auth\.js|sign-register\.js/); assert.doesNotMatch(runtime, /signsubmit-loader|tbquire\(\['sign-register'\]\)|\.on\('click', '\.(?:signin|signup)-loader'/); assert.doesNotMatch(loader, /sign-register/); }); test('static Zibll authentication dimensions and responsive contract are retained', () => { const css = read('assets/css/routes/sign.css'); assert.match(css, /\.sign\s*\{[\s\S]*?max-width:\s*330px/); assert.match(css, /#u_sign\.has-sign-img \.modal-dialog\s*\{\s*width:\s*800px/); assert.match(css, /#u_sign \.sign-img\s*\{[^}]*inset:\s*0 45% 0 0;[^}]*padding:\s*0/); assert.match(css, /#u_sign \.sign-img \+ \.sign\s*\{[^}]*margin-left:\s*55%/); assert.match(css, /\.social-login-item\s*\{[\s\S]*?width:\s*32px;[\s\S]*?height:\s*32px/); assert.match(css, /\.auth-qrcode\s*\{[\s\S]*?width:\s*180px;[\s\S]*?min-height:\s*180px/); assert.match(css, /@media \(max-width:\s*767px\)[\s\S]*?\.sign-img\s*\{\s*display:\s*none/); }); test('authentication settings use reference defaults and canonical keys', () => { const js = read('assets/admin/src/schema/sections/users/auth.js'); const php = read('src/Admin/Schema/SchemaUsers.php'); const all = js + '\n' + php; assert.match(all, /user_sign_type['"]?\s*(?:=>|:)\s*['"]modal/); assert.match(all, /user_signup_captch['"]?\s*(?:=>|:)\s*false/); assert.match(all, /sign_card_position['"]?\s*(?:=>|:)\s*['"]right/); assert.match(all, /sign_show_logo['"]?\s*(?:=>|:)\s*false/); assert.match(all, /sign_modal_show_logo['"]?\s*(?:=>|:)\s*false/); assert.match(all, /invit_code_s/); assert.match(all, /only_nopas/); assert.match(all, /user_signup_no_repas[\s\S]*?dependsOn[\s\S]*?user_signup_captch/); assert.doesNotMatch(all, /user_close_login|user_close_signup|nopas_first|password_first|nopas_only|referral_registration_enabled|referral_register_field/); }); test('authentication galleries save attachment IDs and are consumed by both surfaces', () => { const field = read('assets/admin/src/components/form/AksField.vue'); const gallery = read('assets/admin/src/components/form/AksGalleryField.vue'); const provider = read('src/Admin/SchemaProvider.php'); const reader = read('src/Settings/AuthReader.php'); const modal = read('templates/parts/modal-auth.php'); const page = read('templates/pages/page-sign.php'); const css = read('assets/css/routes/sign.css'); assert.match(field, /\s*'attachment_ids'/); assert.match(provider, /case 'attachment_ids':[\s\S]*?array_map\('absint'/); assert.match(reader, /auth_gallery_ids\('sign_modal_background'\)/); assert.match(reader, /auth_gallery_ids\('sign_page_background'\)/); assert.match(modal, /wp_get_attachment_image\(\$image_id, 'full'/); assert.match(modal, /
<\?php echo \$image_html/); assert.match(page, /wp_get_attachment_image_url\(\$background_id, 'full'\)/); assert.match(page, /
{ const shared = read('templates/parts/auth-content.php'); const modal = read('templates/parts/modal-auth.php'); const client = read('assets/js/auth.js'); const settings = read('src/Settings/AuthReader.php'); assert.match(shared, /data-auth-password-fields/); assert.match(shared, /data-auth-code-fields/); assert.match(shared, /data-login-mode/); ['login', 'register', 'resetpassword'].forEach((scene) => { assert.match(shared, new RegExp(`data-send-code="${scene}"`)); }); assert.match(shared, /\$omit_confirm/); assert.match(shared, /\$ref_mode !== 'hidden'/); assert.match(shared, /\$ref_mode === 'required'/); assert.match(shared, /sign-agreement-implicit/); assert.match(shared, /name="agree_terms"[\s\S]*?required/); assert.match(shared, /oauth-button-lg/); assert.match(shared, /data-auth-qrcode/); assert.match(modal, /data-auto=/); assert.match(client, /aksrtAuthAutoUntil/); assert.match(client, /data-password-show/); assert.match(client, /pollQr/); assert.match(client, /window\.notyf\(escapeHtml\(text\), type \|\| 'info'\)/); assert.match(client, /notify\('请先完成人机验证', 'warning'\)/); assert.match(client, /form\.noValidate = true/); assert.match(client, /form\.checkValidity\(\)[\s\S]*?field\.validationMessage/); assert.match(client, /window\.location\.assign\(authPageUrl/); assert.doesNotMatch(client + shared, /showMessage|data-auth-message|sign-message/); assert.match(settings, /invitation_mode/); assert.match(settings, /\['close', 'open', 'must'\]/); });