Files
wordpress-theme-aksrt/tests/widget-system/widget-admin-lifecycle.test.cjs
T
kate522andClaude Fable 5 a579a5b00a feat(widgets): rebuild admin widgets page to match reference theme
- Replace transfer modal/admin-post flow with reference-style AJAX
  export/import/template dialogs (admin-transfer.js, TransferController)
- Customizer "移出模块" action, reference lazy form loading with t-notice
- Common fields use reference labels, dependencies, compact/inline rows,
  top/bottom-only extra spacing; form header with description/reminder
- Remove placement hint, template preview and legacy transfer code
- Fix widget audit (current_datetime stub, honor catalog common flags)
  and regenerate stale golden fixtures for posts_toc, quote, posts

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-10-30 14:00:57 +08:00

61 lines
3.4 KiB
JavaScript

const test = require('node:test')
const assert = require('node:assert/strict')
const fs = require('node:fs')
const path = require('node:path')
const root = path.resolve(__dirname, '../..')
const core = require(path.join(root, 'assets/widgets/admin-core.js'))
const admin = fs.readFileSync(path.join(root, 'assets/widgets/admin.js'), 'utf8')
const wie = fs.readFileSync(path.join(root, 'assets/widgets/admin-transfer.js'), 'utf8')
const controller =fs.readFileSync(path.join(root, 'src/WidgetSystem/AdminFormController.php'), 'utf8')
const transfer = fs.readFileSync(path.join(root, 'src/WidgetSystem/TransferController.php'), 'utf8')
const renderer = fs.readFileSync(path.join(root, 'src/WidgetSystem/FormRenderer.php'), 'utf8')
const styles = fs.readFileSync(path.join(root, 'assets/widgets/admin.css'), 'utf8')
test('lazy widget forms resolve assigned instances across core and customizer markup', () => {
assert.equal(core.resolveWidgetNumber('widget-aksrt_widget_posts[12][title]', 'widget-aksrt_widget_posts-12', '__i__'), '12')
assert.equal(core.resolveWidgetNumber('', 'widget-aksrt_widget_posts-8', '__i__'), '8')
assert.equal(core.resolveWidgetNumber('', '', '4'), '4')
assert.equal(core.resolveWidgetNumber('', '', '__i__'), '')
assert.equal(core.resolveWidgetNumber('', 'widget-aksrt_widget_posts-0', ''), '')
assert.match(admin, /customize-control-widget_form \.aksrt-widget-form-lazy/)
})
test('lazy form AJAX failures remain retryable and instance filters match WordPress widget forms', () => {
assert.match(admin, /data\('loading', false\)/)
assert.match(controller, /apply_filters\('widget_form_callback', \$instance, \$widget\)/)
})
test('sidebar toolbars drive reference-style AJAX export, import and template modals', () => {
assert.match(wie, /widgets-holder-wrap:not\(#available-widgets\)/)
assert.match(wie, /control-section-sidebar/)
assert.match(wie, /data-aksrt-wie-action/)
assert.match(wie, /data-sidebar-id/)
assert.match(wie, /aksrt-wie-btn-delete/)
assert.match(wie, /nonce: config\.transferNonce/)
for (const action of ['export_sidebar', 'import_sidebar', 'list_templates', 'import_template']) {
assert.match(wie, new RegExp(`aksrt_widgets_${action}`))
assert.match(transfer, new RegExp(`wp_ajax_aksrt_widgets_${action}`))
}
assert.match(transfer, /check_ajax_referer\(self::NONCE, 'nonce'\)/)
assert.match(transfer, /edit_theme_options/)
assert.doesNotMatch(transfer, /aksrt_widgets_template_preview|admin_post_|admin_notices/)
assert.doesNotMatch(admin, /data-aksrt-transfer-action|aksrt-widget-customizer-remove|aksrt-widget-form-lazy__load/)
assert.match(styles, /\.aksrt-wie-modal__dialog/)
})
test('widget fields follow the current CSF compact palette and cloneable group patterns', () => {
assert.match(renderer, /aksrt-widget-palette-choice/)
assert.match(renderer, /<details class="aksrt-widget-repeater__row"/)
assert.match(renderer, /data-min-items=/)
assert.match(admin, /function updateRepeaterControls/)
assert.match(styles, /\.aksrt-widget-choices--palette/)
assert.match(styles, /\.aksrt-widget-repeater__bar/)
assert.match(styles, /\.customize-control-widget_form \.aksrt-widget-field__label/)
assert.match(admin, /if \(!response\?\.success \|\| !response\.data\?\.html\) \{/)
assert.match(admin, /t-notice/)
assert.match(styles, /\.aksrt-widget-field\.is-compact/)
assert.match(admin, /responseJSON\?\.data\?\.message/)
assert.doesNotMatch(admin, /if \(!response\?\.success\) throw new Error/)
})