From 91e86b54530b7375fa623c86dd585b99250e0e9c Mon Sep 17 00:00:00 2001 From: dena Date: Mon, 31 Aug 2026 16:31:47 +0200 Subject: [PATCH 01/17] adjust main.js --- src/main.js | 85 +++++++++++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/src/main.js b/src/main.js index e0279418..412fcb7d 100644 --- a/src/main.js +++ b/src/main.js @@ -12,53 +12,60 @@ import 'typeface-roboto/index.css' import 'vuetify/dist/vuetify.min.css' import config from '~/config' -if (process.env.NODE_ENV !== 'production' && config.API_MOCK === '1') { - const { worker } = require('./backend/mocks/browser') - worker.start() +async function enableMocking () { + if (process.env.NODE_ENV !== 'production' && config.API_MOCK === '1') { + const { worker } = await import('./backend/mocks/browser') + + // `worker.start()` returns a Promise that resolves + // once the Service Worker is up and ready to intercept requests. + return worker.start() + } } -Vue.config.productionTip = false +enableMocking().then(() => { + Vue.config.productionTip = false -Vue.use(Vuetify) + Vue.use(Vuetify) -Vue.use(VueReCaptcha, { - siteKey: config.RECAPTCHA_SITE_KEY, - loaderOptions: { useRecaptchaNet: true }, -}) + Vue.use(VueReCaptcha, { + siteKey: config.RECAPTCHA_SITE_KEY, + loaderOptions: { useRecaptchaNet: true }, + }) -// allow components to access api without importing it -Vue.prototype.$api = api + // allow components to access api without importing it + Vue.prototype.$api = api -/* eslint-disable no-new */ -new Vue({ - el: '#app', - router, - store, - vuetify: new Vuetify({ - icons: { - iconfont: 'mdi', - }, - }), - components: { App }, - template: '', - created: function () { - store.dispatch('login', null) - axios.interceptors.response.use(undefined, function (err) { - return new Promise(function (resolve, reject) { + /* eslint-disable no-new */ + new Vue({ + el: '#app', + router, + store, + vuetify: new Vuetify({ + icons: { + iconfont: 'mdi', + }, + }), + components: { App }, + template: '', + created: function () { + store.dispatch('login', null) + axios.interceptors.response.use(undefined, function (err) { + return new Promise(function (resolve, reject) { // Unauthenticated. is the exact error message returned by the API for the auth middle ware // which is why we check for that message here... - if (err.response.config && !err.response.config.__isRetryRequest && err.response.data && err.response.data.error && err.response.data.error === 'Unauthenticated.') { + if (err.response.config && !err.response.config.__isRetryRequest && err.response.data && err.response.data.error && err.response.data.error === 'Unauthenticated.') { // TODO this IF should also have a condition for is logged in.... - console.log('Detected logged out state, so logging out...') - store - .dispatch('logout') - .then(() => router.push('/login')) - .catch(err => { - console.log(err) - }) - } - reject(err) + console.log('Detected logged out state, so logging out...') + store + .dispatch('logout') + .then(() => router.push('/login')) + .catch(err => { + console.log(err) + }) + } + reject(err) + }) }) - }) - }, + }, + }) }) From fac33715f8799d6ac07273153cea229f26e5ee17 Mon Sep 17 00:00:00 2001 From: dena Date: Mon, 31 Aug 2026 16:32:14 +0200 Subject: [PATCH 02/17] migrate login mock handlers --- src/backend/mocks/default_handlers.js | 55 ++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index 64a18d4e..bd6be05f 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -1,9 +1,62 @@ -// import { http, HttpResponse } from 'msw' +import { http } from 'msw' // implementations for msw v2 handlers go in this file // see old.default_handlers.js for reference // this note can get removed after migration +const myWikis = JSON.parse(localStorage.getItem('msw-myWikis')) || [] + +function makeUser (email = 'test@local') { + return { + id: 1, + email, + verified: true, + created_at: '2020-01-01', + updated_at: '2020-01-01', + } +} + export const handlers = [ + http.get('/api/auth/login', ({ cookies }) => { + const { authToken } = cookies + if (authToken !== 'token_value') { + return Response.json('Unauthorized', { + status: 401, + }) + } + + const user = makeUser() + return Response.json({ user }) + }), + + http.post('/api/auth/login', async ({ request }) => { + const body = await request.json() + const user = makeUser(body.email) + + return Response.json({ user }, { + headers: { 'set-cookie': 'authToken=token_value' }, + }) + }), + + http.delete('/api/auth/login', () => { + return new Response(null, { status: 204 }) + }), + + http.post('/api/user/forgotPassword', () => { + return new Response('Success') + }), + + http.post('/api/user/resetPassword', () => { + return new Response('Success') + }), + + http.post('/api/wiki/mine', () => { + const data = { wikis: myWikis, count: myWikis.length, limit: false } + return Response.json(data) + }), + http.get('/api/v1/policies/missing', () => { + const items = [] + return Response.json({ items }) + }), ] From 1e57ddd776335bcd6765db7d925d69d60f721f16 Mon Sep 17 00:00:00 2001 From: dena Date: Tue, 1 Sep 2026 14:51:43 +0200 Subject: [PATCH 03/17] add verify email handlers --- src/backend/mocks/default_handlers.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index bd6be05f..a0ba45c5 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -50,6 +50,14 @@ export const handlers = [ return new Response('Success') }), + http.post('/api/user/sendVerifyEmail', () => { + return new Response('Already verified') + }), + + http.post('/api/user/verifyEmail', () => { + return new Response('Already verified') + }), + http.post('/api/wiki/mine', () => { const data = { wikis: myWikis, count: myWikis.length, limit: false } return Response.json(data) From 66370a518587d668aed86613d1c8a6c6e5bfd004 Mon Sep 17 00:00:00 2001 From: dena Date: Tue, 1 Sep 2026 15:46:49 +0200 Subject: [PATCH 04/17] add complaint and contact message handlers --- src/backend/mocks/default_handlers.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index a0ba45c5..17aebca1 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -58,6 +58,20 @@ export const handlers = [ return new Response('Already verified') }), + http.post('/api/complaint/sendMessage', () => { + return new Response('Success') + }), + + http.post('/api/contact/sendMessage', async ({ request }) => { + const body = await request.json() + + if (body.name == '' || body.message == '' || body.subject == '') { + return new Response(null, { status: 400 }) + } + + return new Response('Success') + }), + http.post('/api/wiki/mine', () => { const data = { wikis: myWikis, count: myWikis.length, limit: false } return Response.json(data) From de51e277cc7f63fe9eca9f704786d9b64b122e3c Mon Sep 17 00:00:00 2001 From: dena Date: Tue, 1 Sep 2026 17:31:59 +0200 Subject: [PATCH 05/17] migrate remaining old handlers --- src/backend/mocks/default_handlers.js | 181 ++++++++++++++++- src/backend/mocks/old.default_handlers.js | 226 ---------------------- 2 files changed, 180 insertions(+), 227 deletions(-) delete mode 100644 src/backend/mocks/old.default_handlers.js diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index 17aebca1..092519d3 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -4,7 +4,10 @@ import { http } from 'msw' // see old.default_handlers.js for reference // this note can get removed after migration -const myWikis = JSON.parse(localStorage.getItem('msw-myWikis')) || [] +let myWikis = JSON.parse(localStorage.getItem('msw-myWikis')) || [] +let lastWikiId = (myWikis.length && myWikis[myWikis.length - 1].id) || 0 +const user = makeUser() +let getEntityImportCalledTimes = 0 function makeUser (email = 'test@local') { return { @@ -16,6 +19,121 @@ function makeUser (email = 'test@local') { } } +const makeNewWiki = ({ domain, sitename }) => { + const newWiki = { + id: ++lastWikiId, + domain, + sitename, + deleted_at: null, + created_at: '2020-01-01', + updated_at: '2020-01-01', + pivot: { + user_id: user.id, + wiki_id: lastWikiId, + }, + wiki_managers: [{ + email: user.email, + pivot: { + user_id: user.id, + wiki_id: lastWikiId, + }, + }], + wiki_db_version: { + id: 101, + wiki_id: lastWikiId, + version: 'mw1.33-wbs1', + }, + public_settings: [], + } + + myWikis.push(newWiki) + localStorage.setItem('msw-myWikis', JSON.stringify(myWikis)) + + return newWiki +} + +const removeWiki = wikiIndex => { + myWikis = myWikis.splice(wikiIndex, 1) + localStorage.setItem('msw-myWikis', JSON.stringify(myWikis)) +} + +const wikiDiscovery = (referrer, params) => { + const pseudorandom = { + seed: 1, + next: function () { + const x = Math.sin(this.seed++) * 10000 + return x - Math.floor(x) + }, + } + + const names = [ + 'Wikibase Name', + 'A Very Long Wikibase Name', + ] + + let wikis = [...Array(75).keys()].map((id) => { + const wiki = { + id, + domain: id + '-wikibase.wbaas.localhost', + sitename: id + ' - ' + names[id % names.length], + wiki_site_stats: null, + logo_url: null, + } + + if (pseudorandom.next() >= 0.1) { + wiki.wiki_site_stats = { + pages: Math.ceil(pseudorandom.next() * 250), + } + } + + if (pseudorandom.next() >= 0.5) { + wiki.logo_url = new URL(referrer).origin + '/favicon.ico' + } + return wiki + }) + + if (parseInt(params.get('is_active'))) { + wikis = wikis.filter((wiki) => { + const stats = wiki.wiki_site_stats + return stats && stats.pages > 1 + }) + } + + if (params.get('sort') === 'sitename') { + wikis = wikis.sort((a, b) => { + let sort = a.sitename.localeCompare(b.sitename, 'en', { numeric: true }) + if (params.get('direction') === 'desc') { + sort *= -1 + } + return sort + }) + } + + if (params.get('sort') === 'pages') { + wikis = wikis.sort((a, b) => { + const aPages = a.wiki_site_stats ? a.wiki_site_stats.pages : 0 + const bPages = b.wiki_site_stats ? b.wiki_site_stats.pages : 0 + if (params.get('direction') === 'desc') { + return bPages - aPages + } + return aPages - bPages + }) + } + + const currentPage = parseInt(params.get('page')) + const resultsPerPage = parseInt(params.get('per_page')) + const start = (currentPage - 1) * resultsPerPage + const end = start + resultsPerPage + + return { + data: wikis.slice(start, end), + meta: { + last_page: Math.ceil(wikis.length / resultsPerPage), + total: wikis.length, + }, + } +} + export const handlers = [ http.get('/api/auth/login', ({ cookies }) => { const { authToken } = cookies @@ -77,6 +195,67 @@ export const handlers = [ return Response.json(data) }), + http.post('/api/wiki/entityImport', () => { + const data = { status: 'pending', payload: {}, started_at: new Date().toJSON() }; + return Response.json(data) + }), + + http.get('/api/wiki/entityImport', () => { + getEntityImportCalledTimes++ + switch (getEntityImportCalledTimes) { + case 1: + return Response.json([]) + case 2: + return Response.json([{ status: 'pending' }]) + default: + return Response.json([{status: 'success'}]) + } + }), + + http.post('/api/wiki/create', async ({ request }) => { + const body = await request.json() + const data = makeNewWiki(body) + return Response.json(data) + }), + + http.post('/api/wiki/delete', async ({ request }) => { + const wikiId = await request.json().wiki + const wikiIndex = myWikis.findIndex(w => w.id === Number(wikiId)) + + if (wikiIndex < 0) { + return new Response(null, {status: 404}) + } + + removeWiki(wikiIndex) + return new Response('Success') + }), + + http.post('/api/wiki/logo/update', () => { + return new Response('Success') + }), + + http.post(/\/api\/wiki\/setting\/.*?\/update$/, () => { + return new Response('Success') + }), + + http.post('/api/wiki/details', async ({ request }) => { + const wikiId = await request.json().wiki + const wikiDetails = myWikis.find(w => w.id === Number(wikiId)) + + if (!wikiDetails) { + return new Response(null, {status: 404}) + } + + return Response.json(wikiDetails) + }), + + http.get('/api/wiki', async ({ request }) => { + const referrer = await request.referrer + const url = new URL(await request.url) + + return Response.json(wikiDiscovery(referrer, url.searchParams)) + }), + http.get('/api/v1/policies/missing', () => { const items = [] return Response.json({ items }) diff --git a/src/backend/mocks/old.default_handlers.js b/src/backend/mocks/old.default_handlers.js deleted file mode 100644 index 42278322..00000000 --- a/src/backend/mocks/old.default_handlers.js +++ /dev/null @@ -1,226 +0,0 @@ -// this file exists only as reference until all -// legacy handlers are migrated to default_handlers.js - -import { rest } from 'msw' - -let myWikis = JSON.parse(localStorage.getItem('msw-myWikis')) || [] -let lastWikiId = (myWikis.length && myWikis[myWikis.length - 1].id) || 0 -let user = makeUser() -let getEntityImportCalledTimes = 0 - -function makeUser (email = 'test@local') { - return { - id: 1, - email, - verified: true, - created_at: '2020-01-01', - updated_at: '2020-01-01', - } -} - -const makeNewWiki = ({ domain, sitename }) => { - const newWiki = { - id: ++lastWikiId, - domain, - sitename, - deleted_at: null, - created_at: '2020-01-01', - updated_at: '2020-01-01', - pivot: { - user_id: user.id, - wiki_id: lastWikiId, - }, - wiki_managers: [{ - email: user.email, - pivot: { - user_id: user.id, - wiki_id: lastWikiId, - }, - }], - wiki_db_version: { - id: 101, - wiki_id: lastWikiId, - version: 'mw1.33-wbs1', - }, - public_settings: [], - } - - myWikis.push(newWiki) - localStorage.setItem('msw-myWikis', JSON.stringify(myWikis)) - - return newWiki -} - -const removeWiki = wikiIndex => { - myWikis = myWikis.splice(wikiIndex, 1) - localStorage.setItem('msw-myWikis', JSON.stringify(myWikis)) -} - -const wikiDiscovery = (referrer, params) => { - const pseudorandom = { - seed: 1, - next: function () { - const x = Math.sin(this.seed++) * 10000 - return x - Math.floor(x) - }, - } - - const names = [ - 'Wikibase Name', - 'A Very Long Wikibase Name', - ] - - let wikis = [...Array(75).keys()].map((id) => { - const wiki = { - id, - domain: id + '-wikibase.wbaas.localhost', - sitename: id + ' - ' + names[id % names.length], - wiki_site_stats: null, - logo_url: null, - } - - if (pseudorandom.next() >= 0.1) { - wiki.wiki_site_stats = { - pages: Math.ceil(pseudorandom.next() * 250), - } - } - - if (pseudorandom.next() >= 0.5) { - wiki.logo_url = new URL(referrer).origin + '/favicon.ico' - } - return wiki - }) - - if (parseInt(params.get('is_active'))) { - wikis = wikis.filter((wiki) => { - const stats = wiki.wiki_site_stats - return stats && stats.pages > 1 - }) - } - - if (params.get('sort') === 'sitename') { - wikis = wikis.sort((a, b) => { - let sort = a.sitename.localeCompare(b.sitename, 'en', { numeric: true }) - if (params.get('direction') === 'desc') { - sort *= -1 - } - return sort - }) - } - - if (params.get('sort') === 'pages') { - wikis = wikis.sort((a, b) => { - const aPages = a.wiki_site_stats ? a.wiki_site_stats.pages : 0 - const bPages = b.wiki_site_stats ? b.wiki_site_stats.pages : 0 - if (params.get('direction') === 'desc') { - return bPages - aPages - } - return aPages - bPages - }) - } - - const currentPage = parseInt(params.get('page')) - const resultsPerPage = parseInt(params.get('per_page')) - const start = (currentPage - 1) * resultsPerPage - const end = start + resultsPerPage - - return { - data: wikis.slice(start, end), - meta: { - last_page: Math.ceil(wikis.length / resultsPerPage), - total: wikis.length, - }, - } -} - -export const handlers = [ - /* User endpoints */ - rest.post(/\/api\/auth\/login$/, (req, res, ctx) => { - user = makeUser(req.body.email) - return res(ctx.json({ - user, - }), ctx.cookie('authToken', 'token_value')) - }), - rest.get(/\/api\/auth\/login$/, (req, res, ctx) => { - const { authToken } = req.cookies - if (authToken !== 'token_value') { - return res(ctx.status(401)) - } - user = makeUser(req.body.email) - return res(ctx.json({ - user, - })) - }), - rest.delete(/\/api\/auth\/login$/, (req, res, ctx) => { - user = makeUser(req.body.email) - return res(ctx.status(204)) - }), - rest.post(/\/api\/user\/forgotPassword$/, (req, res, ctx) => { - if (req.body.email === 'serverError@example.com') { - return res(ctx.status(400, 'Mocked Server Error')) - } - return res(ctx.status(200)) - }, - ), - rest.post(/\/api\/user\/resetPassword$/, (_, res, ctx) => res(ctx.status(200))), - rest.post(/\/api\/user\/sendVerifyEmail$/, (_, res, ctx) => res(ctx.json({ message: 'Already verified' }))), - rest.post(/\/api\/user\/verifyEmail$/, (_, res, ctx) => res(ctx.status(200))), - rest.post(/\/api\/complaint\/sendMessage$/, (req, res, ctx) => res(ctx.status(200))), - rest.post(/\/api\/contact\/sendMessage$/, (req, res, ctx) => { - if (req.body.name === 'recaptchaError') { - return res(ctx.status(401, 'Mocked recaptcha Error')) - } - if (req.body.name === '') { - return res(ctx.status(400, 'Mocked empty name Error')) - } - if (req.body.recaptcha === '') { - return res(ctx.status(400, 'Mocked recaptcha empty Error')) - } - return res(ctx.status(200)) - }, - ), - - /* Wiki endpoints */ - rest.post(/\/api\/wiki\/entityImport$/, (_, res, ctx) => { - return res(ctx.json({ data: { status: 'pending', payload: {}, started_at: new Date().toJSON() } })) - }), - rest.get(/\/api\/wiki\/entityImport$/, (_, res, ctx) => { - getEntityImportCalledTimes++ - switch (getEntityImportCalledTimes) { - case 1: - return res(ctx.json({ data: [] })) - case 2: - return res(ctx.json({ data: [{ status: 'pending' }] })) - default: - return res(ctx.json({ data: [{ status: 'success' }] })) - } - }), - rest.get(/\/api\/wiki\/count$/, (_, res, ctx) => res(ctx.json({ data: 1 }))), - rest.post(/\/api\/wiki\/mine$/, (_, res, ctx) => res(ctx.json({ wikis: myWikis, count: myWikis.length, limit: false }))), - rest.post(/\/api\/wiki\/create$/, (req, res, ctx) => { - return res(ctx.json({ data: makeNewWiki(req.body) })) - }), - rest.post(/\/api\/wiki\/delete$/, (req, res, ctx) => { - const wikiId = req.body.wiki - const wikiIndex = myWikis.findIndex(w => w.id === Number(wikiId)) - if (wikiIndex < 0) { - return res(ctx.status(404)) - } - - removeWiki(wikiIndex) - return res(ctx.status(200)) - }), - rest.post(/\/api\/wiki\/logo\/update$/, (_, res, ctx) => res(ctx.status(200))), - rest.post(/\/api\/wiki\/setting\/.*?\/update$/, (_, res, ctx) => res(ctx.status(200))), - rest.post(/\/api\/wiki\/details$/, (req, res, ctx) => { - const wikiId = req.body.wiki - const wikiDetails = myWikis.find(w => w.id === Number(wikiId)) - if (!wikiDetails) { - return res(ctx.status(404)) - } - return res(ctx.json({ data: wikiDetails }), ctx.status(200)) - }), - rest.get(/\/api\/wiki$/, (req, res, ctx) => { - return res(ctx.json(wikiDiscovery(req.referrer, req.url.searchParams))) - }), -] From 9cd23e61c899516ce3c8b2bae1f56dc4129de872 Mon Sep 17 00:00:00 2001 From: dena Date: Tue, 1 Sep 2026 17:34:27 +0200 Subject: [PATCH 06/17] formatting --- src/backend/mocks/default_handlers.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index 092519d3..bdf48449 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -196,7 +196,7 @@ export const handlers = [ }), http.post('/api/wiki/entityImport', () => { - const data = { status: 'pending', payload: {}, started_at: new Date().toJSON() }; + const data = { status: 'pending', payload: {}, started_at: new Date().toJSON() } return Response.json(data) }), @@ -208,7 +208,7 @@ export const handlers = [ case 2: return Response.json([{ status: 'pending' }]) default: - return Response.json([{status: 'success'}]) + return Response.json([{ status: 'success' }]) } }), @@ -223,7 +223,7 @@ export const handlers = [ const wikiIndex = myWikis.findIndex(w => w.id === Number(wikiId)) if (wikiIndex < 0) { - return new Response(null, {status: 404}) + return new Response(null, { status: 404 }) } removeWiki(wikiIndex) @@ -243,9 +243,9 @@ export const handlers = [ const wikiDetails = myWikis.find(w => w.id === Number(wikiId)) if (!wikiDetails) { - return new Response(null, {status: 404}) + return new Response(null, { status: 404 }) } - + return Response.json(wikiDetails) }), From 7c9fdc15bc8eb05090892296cede58405036d3e8 Mon Sep 17 00:00:00 2001 From: dena Date: Tue, 1 Sep 2026 17:44:11 +0200 Subject: [PATCH 07/17] fix obj access --- src/backend/mocks/default_handlers.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index bdf48449..3959cf8f 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -219,7 +219,8 @@ export const handlers = [ }), http.post('/api/wiki/delete', async ({ request }) => { - const wikiId = await request.json().wiki + const body = await request.json() + const wikiId = body.wiki const wikiIndex = myWikis.findIndex(w => w.id === Number(wikiId)) if (wikiIndex < 0) { @@ -239,7 +240,8 @@ export const handlers = [ }), http.post('/api/wiki/details', async ({ request }) => { - const wikiId = await request.json().wiki + const body = await request.json() + const wikiId = body.wiki const wikiDetails = myWikis.find(w => w.id === Number(wikiId)) if (!wikiDetails) { From b553dda7112b8ed67a0447a64e7265eb1ba1e696 Mon Sep 17 00:00:00 2001 From: dena Date: Thu, 3 Sep 2026 12:11:01 +0200 Subject: [PATCH 08/17] fix wiki details response --- src/backend/mocks/default_handlers.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index 3959cf8f..f541a430 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -248,7 +248,10 @@ export const handlers = [ return new Response(null, { status: 404 }) } - return Response.json(wikiDetails) + return Response.json({ + success: true, + data: wikiDetails, + }) }), http.get('/api/wiki', async ({ request }) => { From 43d67df223eaec05bfa96f44b0d45815aa29348f Mon Sep 17 00:00:00 2001 From: dena Date: Thu, 3 Sep 2026 13:41:51 +0200 Subject: [PATCH 09/17] strcit type checks --- src/backend/mocks/default_handlers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index f541a430..d0ac5775 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -183,7 +183,7 @@ export const handlers = [ http.post('/api/contact/sendMessage', async ({ request }) => { const body = await request.json() - if (body.name == '' || body.message == '' || body.subject == '') { + if (body.name === '' || body.message === '' || body.subject === '') { return new Response(null, { status: 400 }) } From ad97409b0706edea2df6db36ac4da23fe10c4310 Mon Sep 17 00:00:00 2001 From: dena Date: Thu, 3 Sep 2026 14:03:57 +0200 Subject: [PATCH 10/17] fix create wiki response --- src/backend/mocks/default_handlers.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index d0ac5775..b9caf4a5 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -214,8 +214,11 @@ export const handlers = [ http.post('/api/wiki/create', async ({ request }) => { const body = await request.json() - const data = makeNewWiki(body) - return Response.json(data) + const newWiki = makeNewWiki(body) + return Response.json({ + success: true, + data: newWiki, + }) }), http.post('/api/wiki/delete', async ({ request }) => { From 77bb18af0eb95a5264d83773dcbd2748f79136bf Mon Sep 17 00:00:00 2001 From: dena Date: Thu, 3 Sep 2026 16:51:37 +0200 Subject: [PATCH 11/17] add handler for current policy --- src/backend/mocks/default_handlers.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index b9caf4a5..2803eb98 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -268,4 +268,27 @@ export const handlers = [ const items = [] return Response.json({ items }) }), + + http.get('/api/v1/policies/current', () => { + const items = [ + { + metadata: { + policy_id: 2, + type: 'terms-of-use', + active_from: '2026-08-27', + content_vue_file: 'terms-of-use/version-2.vue', + }, + }, + { + metadata: { + policy_id: 3, + type: 'hosting-policy', + active_from: '2026-08-27', + content_vue_file: 'hosting-policy/version-1.vue', + }, + }, + ] + + return Response.json({ items }) + }), ] From 0e20438ab491a788dcdfaf85fc4015ddcda445de Mon Sep 17 00:00:00 2001 From: dena Date: Thu, 3 Sep 2026 16:51:48 +0200 Subject: [PATCH 12/17] disable mock bypass --- src/main.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.js b/src/main.js index 412fcb7d..09f46070 100644 --- a/src/main.js +++ b/src/main.js @@ -18,7 +18,8 @@ async function enableMocking () { // `worker.start()` returns a Promise that resolves // once the Service Worker is up and ready to intercept requests. - return worker.start() + // onUnhandledRequest: 'error' saves us from a false belief that mocks are working when they aren't + return worker.start({ onUnhandledRequest: 'error' }) } } From 643823a5ebe627b1f6c004a4980b85de929f09cc Mon Sep 17 00:00:00 2001 From: dena Date: Thu, 3 Sep 2026 17:34:32 +0200 Subject: [PATCH 13/17] fix removeWiki --- src/backend/mocks/default_handlers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index 2803eb98..92396f01 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -53,7 +53,7 @@ const makeNewWiki = ({ domain, sitename }) => { } const removeWiki = wikiIndex => { - myWikis = myWikis.splice(wikiIndex, 1) + myWikis.splice(wikiIndex, 1) localStorage.setItem('msw-myWikis', JSON.stringify(myWikis)) } From 493007439455c87e224f3eb1c5501669db4b4823 Mon Sep 17 00:00:00 2001 From: dena Date: Thu, 3 Sep 2026 17:35:22 +0200 Subject: [PATCH 14/17] fix user --- src/backend/mocks/default_handlers.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index 92396f01..4cc5b67b 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -6,7 +6,7 @@ import { http } from 'msw' let myWikis = JSON.parse(localStorage.getItem('msw-myWikis')) || [] let lastWikiId = (myWikis.length && myWikis[myWikis.length - 1].id) || 0 -const user = makeUser() +let user = makeUser() let getEntityImportCalledTimes = 0 function makeUser (email = 'test@local') { @@ -143,13 +143,13 @@ export const handlers = [ }) } - const user = makeUser() + user = makeUser() return Response.json({ user }) }), http.post('/api/auth/login', async ({ request }) => { const body = await request.json() - const user = makeUser(body.email) + user = makeUser(body.email) return Response.json({ user }, { headers: { 'set-cookie': 'authToken=token_value' }, From 7d8696f3312d91e9a5b3cea75c09df52c56bbd5b Mon Sep 17 00:00:00 2001 From: dena Date: Thu, 3 Sep 2026 17:38:12 +0200 Subject: [PATCH 15/17] fix entityimport handler --- src/backend/mocks/default_handlers.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index 4cc5b67b..5962d8f1 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -204,11 +204,11 @@ export const handlers = [ getEntityImportCalledTimes++ switch (getEntityImportCalledTimes) { case 1: - return Response.json([]) + return Response.json({ data: [] }) case 2: - return Response.json([{ status: 'pending' }]) + return Response.json({ data: [{ status: 'pending' }] }) default: - return Response.json([{ status: 'success' }]) + return Response.json({data: [{ status: 'success' }] }) } }), From 108889cf087b1e9c73cf9e939942c8449775b9d3 Mon Sep 17 00:00:00 2001 From: dena Date: Thu, 3 Sep 2026 17:42:20 +0200 Subject: [PATCH 16/17] formatting --- src/backend/mocks/default_handlers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index 5962d8f1..64b86c11 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -4,7 +4,7 @@ import { http } from 'msw' // see old.default_handlers.js for reference // this note can get removed after migration -let myWikis = JSON.parse(localStorage.getItem('msw-myWikis')) || [] +const myWikis = JSON.parse(localStorage.getItem('msw-myWikis')) || [] let lastWikiId = (myWikis.length && myWikis[myWikis.length - 1].id) || 0 let user = makeUser() let getEntityImportCalledTimes = 0 @@ -208,7 +208,7 @@ export const handlers = [ case 2: return Response.json({ data: [{ status: 'pending' }] }) default: - return Response.json({data: [{ status: 'success' }] }) + return Response.json({ data: [{ status: 'success' }] }) } }), From 132b2e9ca870620d4180d149e90869fdfd72efeb Mon Sep 17 00:00:00 2001 From: dena Date: Thu, 3 Sep 2026 17:42:51 +0200 Subject: [PATCH 17/17] remove obsolete note --- src/backend/mocks/default_handlers.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/backend/mocks/default_handlers.js b/src/backend/mocks/default_handlers.js index 64b86c11..62367054 100644 --- a/src/backend/mocks/default_handlers.js +++ b/src/backend/mocks/default_handlers.js @@ -1,9 +1,5 @@ import { http } from 'msw' -// implementations for msw v2 handlers go in this file -// see old.default_handlers.js for reference -// this note can get removed after migration - const myWikis = JSON.parse(localStorage.getItem('msw-myWikis')) || [] let lastWikiId = (myWikis.length && myWikis[myWikis.length - 1].id) || 0 let user = makeUser()