import test from 'node:test' import assert from 'node:assert/strict' import fs from 'node:fs' import path from 'node:path' import vm from 'node:vm' const addFile = path.resolve('src/views/modules/activity/add.vue') function loadHandleTempSave () { const source = fs.readFileSync(addFile, 'utf8') const start = source.indexOf(' handleTempSave () {') const end = source.indexOf('\n handlePrevious () {', start) assert.notEqual(start, -1, '应找到保存草稿方法') assert.notEqual(end, -1, '应找到保存草稿方法结束位置') const method = source.slice(start, end) .replace(' handleTempSave () {', 'function handleTempSave () {') .replace(/\n },\s*$/, '\n}') const context = { Date, JSON } vm.createContext(context) vm.runInContext(`${method}\nthis.handleTempSave = handleTempSave`, context) return context.handleTempSave } function loadAutoSave () { const source = fs.readFileSync(addFile, 'utf8') const start = source.indexOf(' autoSave () {') const end = source.indexOf('\n handleSave () {', start) assert.notEqual(start, -1, '应找到自动保存方法') assert.notEqual(end, -1, '应找到自动保存方法结束位置') const method = source.slice(start, end) .replace(' autoSave () {', 'function autoSave () {') .replace(/\n },\s*$/, '\n}') const context = { JSON } vm.createContext(context) vm.runInContext(`${method}\nthis.autoSave = autoSave`, context) return context.autoSave } test('空白活动名称不能提交保存草稿请求', () => { const handleTempSave = loadHandleTempSave() const errors = [] const requests = [] const component = { basicForm: { id: '', activityName: ' ', categoryIdsArr: [], signupStartTime: '', signupEndTime: '', activityStartTime: '', activityEndTime: '' }, moreForm: {}, syncCategoryIds: () => {}, $message: { error: message => errors.push(message), success: () => {} }, $http: { post: (...args) => { requests.push(args) return Promise.resolve({ data: { code: 0 } }) } }, $router: { push: () => {} } } handleTempSave.call(component) assert.deepEqual(errors, ['请填写活动名称后再保存草稿']) assert.equal(requests.length, 0) }) test('编辑草稿自动保存时保留草稿状态', async () => { const source = fs.readFileSync(addFile, 'utf8') const initialForm = source.slice( source.indexOf('const getInitialBasicForm = () => ({'), source.indexOf('const getInitialMoreForm = () => ({') ) assert.match(initialForm, /activeState:\s*null/, '表单必须接收详情接口返回的活动状态') const autoSave = loadAutoSave() const requests = [] const component = { basicForm: { id: '1', activityName: '测试草稿', activeState: -2 }, moreForm: { state: false }, autoSaving: false, $message: { error: () => {} }, $http: { put: (...args) => { requests.push(args) return Promise.resolve({ data: { code: 0 } }) } } } autoSave.call(component) await Promise.resolve() assert.equal(requests.length, 1) assert.equal(requests[0][1].activeState, -2) }) test('编辑草稿名称为空时不执行自动保存', () => { const autoSave = loadAutoSave() const errors = [] const requests = [] const component = { basicForm: { id: '1', activityName: ' ', activeState: -2 }, moreForm: { state: false }, autoSaving: false, $message: { error: message => errors.push(message) }, $http: { put: (...args) => { requests.push(args) return Promise.resolve({ data: { code: 0 } }) } } } autoSave.call(component) assert.deepEqual(errors, ['请填写活动名称后再自动保存草稿']) assert.equal(requests.length, 0) })