diff --git a/scripts/tests/wechatAuthorization.test.mjs b/scripts/tests/wechatAuthorization.test.mjs new file mode 100644 index 0000000..c110ab3 --- /dev/null +++ b/scripts/tests/wechatAuthorization.test.mjs @@ -0,0 +1,108 @@ +import test from 'node:test' +import assert from 'node:assert/strict' +import { readFileSync } from 'node:fs' +import { createRequire } from 'node:module' +import ts from 'typescript' +import * as vue from 'vue' +import { compileScript, parse } from '@vue/compiler-sfc' + +const require = createRequire(import.meta.url) +const elementPlusRequire = createRequire(require.resolve('element-plus')) +const Schema = elementPlusRequire('async-validator').default +const { descriptor } = parse( + readFileSync( + 'src/views/settings/payment-merchant-pools/components/WechatAuthorizationManagement.vue', + 'utf8' + ) +) +const compiled = ts.transpileModule( + compileScript(descriptor, { id: 'wechat-authorization-test' }).content, + { compilerOptions: { target: ts.ScriptTarget.ES2022, module: ts.ModuleKind.CommonJS } } +).outputText + +function harness() { + const calls = [] + const imports = { + vue: { ...vue, onMounted: () => {}, onUnmounted: () => {} }, + 'element-plus': { ElMessage: { success: () => {} } }, + '@/api/modules': { + PaymentMerchantPoolsService: { + updateWechatAuthorization: async (payload) => { + calls.push({ ...payload }) + return { code: 0, data: payload } + } + } + }, + '@/composables/useAuth': { useAuth: () => ({ hasAuth: () => true }) }, + '@/config/constants/paymentMerchantPools': { + PAYMENT_MERCHANT_POOL_PERMISSIONS: { wechatAuthEdit: 'wechat_auth_edit' } + } + } + const module = { exports: {} } + new Function('require', 'module', 'exports', 'computed', compiled)( + (name) => { + assert.ok(imports[name], `Unexpected runtime dependency: ${name}`) + return imports[name] + }, + module, + module.exports, + vue.computed + ) + const state = module.exports.default.setup({}, { expose: () => {} }) + state.formRef.value = { + validate: () => new Schema(state.formRules).validate(state.form) + } + return { state, calls } +} + +test('miniapp AppID starts empty without default or placeholder text', () => { + const { state } = harness() + assert.equal(state.form.miniapp_app_id, '') + const input = descriptor.template.content.match( + /]*v-model="form\.miniapp_app_id"[^>]*\/>/ + )?.[0] + assert.ok(input) + assert.doesNotMatch(input, /\b(?:placeholder|(?:default-)?value)\s*=/) +}) + +for (const enabled of [false, true]) { + for (const miniappAppId of ['', ' ', null, undefined]) { + test(`saves ${enabled ? 'enabled' : 'disabled'} authorization without optional AppID ${JSON.stringify(miniappAppId)}`, async () => { + const { state, calls } = harness() + Object.assign(state.form, { + enabled, + miniapp_app_id: miniappAppId, + oa_app_id: 'wx-official-account', + oa_oauth_redirect_url: 'https://example.com/oauth' + }) + await state.handleSubmit() + + assert.deepEqual(calls, [ + { + enabled, + oa_app_id: 'wx-official-account', + oa_oauth_redirect_url: 'https://example.com/oauth' + } + ]) + }) + } +} + +test('submits a provided miniapp AppID after trimming and clears sensitive inputs after saving', async () => { + const { state, calls } = harness() + state.form.miniapp_app_id = ' wx-miniapp ' + state.sensitive.miniapp_app_secret = 'new-miniapp-secret' + await state.handleSubmit() + + assert.equal(calls[0].miniapp_app_id, 'wx-miniapp') + assert.equal(calls[0].miniapp_app_secret, 'new-miniapp-secret') + assert.equal(state.sensitive.miniapp_app_secret, '') +}) + +test('still rejects a miniapp AppID longer than 64 characters', async () => { + const { state, calls } = harness() + state.form.miniapp_app_id = 'x'.repeat(65) + await state.handleSubmit() + + assert.deepEqual(calls, []) +}) diff --git a/src/views/settings/payment-merchant-pools/components/WechatAuthorizationManagement.vue b/src/views/settings/payment-merchant-pools/components/WechatAuthorizationManagement.vue index 8406be0..92ac6f0 100644 --- a/src/views/settings/payment-merchant-pools/components/WechatAuthorizationManagement.vue +++ b/src/views/settings/payment-merchant-pools/components/WechatAuthorizationManagement.vue @@ -23,8 +23,8 @@ 小程序授权 - - + +