举报内容与举证<\/h3>
未填写<\/div>/);
assert.match(html, /class="jio-ban-summary">人身攻击<\/div>/);
});
test('dedicated ban assets enqueue only on the matching native page', () => {
const { assets } = phpFixture();
assert.equal(assets.styles.length, 1);
assert.deepEqual(assets.styles[0].slice(0, 3), [
'jio-admin-user-ban', 'https://theme.example.test/assets/css/admin/user-ban.css', ['jio-admin-native-ui'],
]);
assert.equal(assets.scripts.length, 1);
assert.deepEqual(assets.scripts[0].slice(0, 3), [
'jio-admin-user-ban', 'https://theme.example.test/assets/js/admin-user-ban.js', [],
]);
assert.equal(assets.scripts[0][4], true);
});
test('PHP actions reject blank notes and stale versions, and preserve filter roundtrips', () => {
const { actions } = phpFixture();
assert.equal(actions.blank_report.message, 'report_failed');
assert.match(actions.blank_report.args.jio_ban_error, /必须填写处理说明/);
assert.equal(actions.stale_report.message, 'report_failed');
assert.match(actions.stale_report.args.jio_ban_error, /已变化或已处理/);
assert.equal(actions.valid_report.message, 'report_updated');
assert.deepEqual({
type: actions.valid_report.args.type,
status: actions.valid_report.args.status,
s: actions.valid_report.args.s,
send_user: actions.valid_report.args.send_user,
orderby: actions.valid_report.args.orderby,
order: actions.valid_report.args.order,
paged: actions.valid_report.args.paged,
}, { type: 'report', status: 'pending', s: 'needle', send_user: 7, orderby: 'updated', order: 'ASC', paged: 2 });
assert.equal(actions.blank_appeal.message, 'appeal_failed');
assert.match(actions.blank_appeal.args.jio_ban_error, /必须填写拒绝原因/);
assert.equal(actions.valid_appeal.message, 'appeal_rejected');
assert.equal(actions.appeal_status, 'rejected');
assert.equal(actions.appeal_payload.admin_note, 'Missing evidence');
assert.equal(actions.approve_appeal.message, 'appeal_approved');
assert.equal(actions.approved_status, 'approved');
assert.equal(actions.restrictions_lifted, 1);
assert.deepEqual(actions.report_calls, [[9001, 'resolved', 'Reviewed']]);
assert.equal(actions.messages.length, 2);
});
test('ban admin contract keeps the single-dialog flow and separate native operations', () => {
const users = read('src/Admin/Native/UsersMenus.php');
const page = read('src/Admin/Native/UsersMenusBan.php');
const query = read('src/Admin/Native/UsersMenusBanQuery.php');
const actions = read('src/Admin/Native/UsersMenusBanActions.php');
const dialogs = read('src/Admin/Native/UsersMenusBanDialogs.php');
const script = read('assets/js/admin-user-ban.js');
const css = read('assets/css/admin/user-ban.css');
assert.match(users, /use UsersMenusBan;/);
assert.match(users, /admin_post_jio_users_update_report/);
assert.match(users, /admin_post_jio_users_process_appeal/);
assert.doesNotMatch(users, /use UsersMenusTickets;/);
assert.ok(!fs.existsSync(path.join(root, 'src/Admin/Native/UsersMenusTickets.php')));
assert.match(page, /if \(\$hook !== 'users_page_jio_user_ban'\) return/);
assert.match(page, /