DEV: Resolve and prevent user fixture changes leaking between tests (#23898)

- Introduces a `deepFreeze` helper to block any mutations to the current-user fixture

- Add `cloneJSON` to any places which were previously causing mutations
This commit is contained in:
David Taylor
2023-10-11 13:46:06 +01:00
committed by GitHub
parent b77b0ee1c8
commit 6970c7dc13
5 changed files with 31 additions and 5 deletions

View File

@ -59,3 +59,19 @@ export function deepEqual(obj1, obj2) {
export function cloneJSON(obj) { export function cloneJSON(obj) {
return JSON.parse(JSON.stringify(obj)); return JSON.parse(JSON.stringify(obj));
} }
export function deepFreeze(object) {
// Retrieve the property names defined on object
const propNames = Reflect.ownKeys(object);
// Freeze properties before freezing self
for (const name of propNames) {
const value = object[name];
if ((value && typeof value === "object") || typeof value === "function") {
deepFreeze(value);
}
}
return Object.freeze(object);
}

View File

@ -1,5 +1,7 @@
import { deepFreeze } from "discourse-common/lib/object";
export default { export default {
"/session/current.json": { "/session/current.json": deepFreeze({
current_user: { current_user: {
id: 19, id: 19,
username: "eviltrout", username: "eviltrout",
@ -133,5 +135,5 @@ export default {
}, },
] ]
}, },
}, }),
}; };

View File

@ -2,6 +2,7 @@ import { getRenderDirector } from "discourse/lib/notification-types-manager";
import Site from "discourse/models/site"; import Site from "discourse/models/site";
import User from "discourse/models/user"; import User from "discourse/models/user";
import sessionFixtures from "discourse/tests/fixtures/session-fixtures"; import sessionFixtures from "discourse/tests/fixtures/session-fixtures";
import { cloneJSON } from "discourse-common/lib/object";
export function createRenderDirector( export function createRenderDirector(
notification, notification,
@ -11,7 +12,9 @@ export function createRenderDirector(
const director = getRenderDirector( const director = getRenderDirector(
notificationType, notificationType,
notification, notification,
User.create(sessionFixtures["/session/current.json"].current_user), User.create(
cloneJSON(sessionFixtures["/session/current.json"].current_user)
),
siteSettings, siteSettings,
Site.current() Site.current()
); );

View File

@ -96,7 +96,9 @@ import { _clearSnapshots } from "select-kit/components/composer-actions";
import { cleanupTemporaryModuleRegistrations } from "./temporary-module-helper"; import { cleanupTemporaryModuleRegistrations } from "./temporary-module-helper";
export function currentUser() { export function currentUser() {
return User.create(sessionFixtures["/session/current.json"].current_user); return User.create(
cloneJSON(sessionFixtures["/session/current.json"].current_user)
);
} }
let _initialized = new Set(); let _initialized = new Set();

View File

@ -2,12 +2,15 @@ import { getRenderDirector } from "discourse/lib/reviewable-types-manager";
import Site from "discourse/models/site"; import Site from "discourse/models/site";
import User from "discourse/models/user"; import User from "discourse/models/user";
import sessionFixtures from "discourse/tests/fixtures/session-fixtures"; import sessionFixtures from "discourse/tests/fixtures/session-fixtures";
import { cloneJSON } from "discourse-common/lib/object";
export function createRenderDirector(reviewable, reviewableType, siteSettings) { export function createRenderDirector(reviewable, reviewableType, siteSettings) {
const director = getRenderDirector( const director = getRenderDirector(
reviewableType, reviewableType,
reviewable, reviewable,
User.create(sessionFixtures["/session/current.json"].current_user), User.create(
cloneJSON(sessionFixtures["/session/current.json"].current_user)
),
siteSettings, siteSettings,
Site.current() Site.current()
); );