Skip to content

Commit

Permalink
refactor unleash service and add some mocking
Browse files Browse the repository at this point in the history
  • Loading branch information
andnorda committed May 14, 2024
1 parent d9aa676 commit 86d322e
Show file tree
Hide file tree
Showing 11 changed files with 145 additions and 105 deletions.
Binary file modified bun.lockb
Binary file not shown.
4 changes: 4 additions & 0 deletions packages/server/src/env/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import { BoostEnviroment } from "decorator-shared/params";
import { z } from "zod";

export const serverSchema = z.object({
UNLEASH_SERVER_API_TOKEN: z.string(),
UNLEASH_SERVER_API_URL: z.string().url(),
ENONICXP_SERVICES: z.string().url(),
SEARCH_API: z.string().url(),
XP_BASE_URL: z.string().url(),
Expand All @@ -19,6 +21,8 @@ export type RunningEnv = z.infer<typeof serverSchema>["ENV"];
export type NodeEnv = z.infer<typeof serverSchema>["NODE_ENV"];

export const serverEnv = {
UNLEASH_SERVER_API_TOKEN: process.env.UNLEASH_SERVER_API_TOKEN,
UNLEASH_SERVER_API_URL: process.env.UNLEASH_SERVER_API_URL,
ENONICXP_SERVICES: process.env.ENONICXP_SERVICES,
SEARCH_API: process.env.SEARCH_API,
XP_BASE_URL: process.env.XP_BASE_URL,
Expand Down
16 changes: 5 additions & 11 deletions packages/server/src/json-index.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,15 @@
import { Params } from "decorator-shared/params";
import { clientEnv, env } from "./env/server";
import { texts } from "./texts";
import { getFeatures } from "./unleash";
import { cdnUrl, entryPointPath, getManifest } from "./views";
import { DecoratorData } from "./views/decorator-data";
import { clientEnv, env } from "./env/server";
import { GetFeatures } from "./unleash-service";
import { Params } from "decorator-shared/params";

export default async ({
unleashService,
data,
}: {
unleashService: GetFeatures;
data: Params;
}) => {
export default async ({ data }: { data: Params }) => {
const { language } = data;
const localTexts = texts[language];

const features = unleashService.getFeatures();
const features = getFeatures();

const { links, scripts } = await getEnvAssetsRaw();

Expand Down
2 changes: 1 addition & 1 deletion packages/server/src/menu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const TEN_SECONDS_MS = 10 * 1000;

const menuCache = new ResponseCache<MenuNode[]>({ ttl: TEN_SECONDS_MS });

export const fetchMenu = async (): Promise<MenuNode[]> => {
const fetchMenu = async (): Promise<MenuNode[]> => {
const menu = await menuCache.get("menu", () =>
fetch(`${env.ENONICXP_SERVICES}/no.nav.navno/menu`).then(
(response) => response.json() as Promise<MenuNode[]>,
Expand Down
4 changes: 4 additions & 0 deletions packages/server/src/mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@ import { HttpResponse, http } from "msw";
import { setupServer } from "msw/node";
import notificationsMock from "./notifications-mock.json";
import { env } from "./env/server";
import testData from "./content-test-data.json";

export default () =>
setupServer(
http.get(`${env.ENONICXP_SERVICES}/no.nav.navno/menu`, () =>
HttpResponse.json(testData),
),
http.get("http://localhost:8089/api/varselbjelle/varsler", () =>
HttpResponse.json(notificationsMock),
),
Expand Down
102 changes: 57 additions & 45 deletions packages/server/src/render-index.test.ts
Original file line number Diff line number Diff line change
@@ -1,51 +1,63 @@
import { afterAll, expect, test } from "bun:test";
import renderIndex from "./render-index";
import UnleashService from "./unleash-service";
import { http, HttpResponse } from "msw";
import { env } from "./env/server";
import {
afterAll,
afterEach,
beforeAll,
beforeEach,
expect,
test,
describe,
} from "bun:test";
import { clearCache } from "decorator-shared/cache";
import { HttpResponse, http } from "msw";
import { SetupServerApi, setupServer } from "msw/node";
import testData from "./content-test-data.json";
import { setupServer } from "msw/node";

const unleashService = new UnleashService({ mock: true });
import { env } from "./env/server";
import renderIndex from "./render-index";

test("It masks the document from hotjar", async () => {
const server = setupServer(
http.get(`${env.ENONICXP_SERVICES}/no.nav.navno/menu`, () =>
HttpResponse.json(testData),
),
);
server.listen();
describe("render-index", () => {
let server: SetupServerApi;

beforeAll(() => {
server = setupServer(
http.get(`${env.ENONICXP_SERVICES}/no.nav.navno/menu`, () =>
HttpResponse.json(testData),
),
);
server.listen();
});
beforeEach(() => clearCache());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());

expect(
await renderIndex({
unleashService,
data: {
redirectToLogout: "https://www.nav.no",
context: "privatperson",
simple: false,
simpleHeader: false,
simpleFooter: false,
enforceLogin: false,
redirectToApp: false,
level: "Level3",
language: "en",
availableLanguages: [],
breadcrumbs: [],
utilsBackground: "transparent",
feedback: false,
chatbot: true,
chatbotVisible: false,
urlLookupTable: false,
shareScreen: false,
logoutUrl: "/logout",
maskHotjar: true,
logoutWarning: false,
redirectToUrl: "https://www.nav.no",
ssr: true,
},
url: "localhost:8089/",
}),
).toContain("data-hj-supress");
test("It masks the document from hotjar", async () => {
expect(
await renderIndex({
data: {
redirectToLogout: "https://www.nav.no",
context: "privatperson",
simple: false,
simpleHeader: false,
simpleFooter: false,
enforceLogin: false,
redirectToApp: false,
level: "Level3",
language: "en",
availableLanguages: [],
breadcrumbs: [],
utilsBackground: "transparent",
feedback: false,
chatbot: true,
chatbotVisible: false,
urlLookupTable: false,
shareScreen: false,
logoutUrl: "/logout",
maskHotjar: true,
logoutWarning: false,
redirectToUrl: "https://www.nav.no",
ssr: true,
},
url: "localhost:8089/",
}),
).toContain("data-hj-supress");
});
});
18 changes: 5 additions & 13 deletions packages/server/src/render-index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { makeContextLinks } from "decorator-shared/context";
import { Params } from "decorator-shared/params";
import { Features, Texts } from "decorator-shared/types";
import { getComplexFooterLinks, getSimpleFooterLinks } from "./menu";
import { clientEnv, env } from "./env/server";
import { getComplexFooterLinks, getSimpleFooterLinks } from "./menu";
import { texts as i18n } from "./texts";
import { GetFeatures } from "./unleash-service";
import { getFeatures } from "./unleash";
import { Index } from "./views";
import { DecoratorData } from "./views/decorator-data";
import { DecoratorUtils } from "./views/decorator-utils";
Expand All @@ -13,23 +13,15 @@ import { ComplexHeader } from "./views/header/complex-header";
import { SimpleHeader } from "./views/header/simple-header";
import { getSplashPage } from "./views/splash-page";

export default async ({
unleashService,
data,
url,
}: {
unleashService: GetFeatures;
data: Params;
url: string;
}) => {
export default async ({ data, url }: { data: Params; url: string }) => {
const { language } = data;
const texts = i18n[language];

const features = unleashService.getFeatures();
const features = getFeatures();

return Index({
language,
header: await renderHeader({
header: renderHeader({
texts,
data,
}),
Expand Down
58 changes: 32 additions & 26 deletions packages/server/src/request-handler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,61 +2,67 @@ import {
afterAll,
afterEach,
beforeAll,
beforeEach,
describe,
expect,
test,
} from "bun:test";
import { clearCache } from "decorator-shared/cache";
import { HttpResponse, http } from "msw";
import { SetupServerApi, setupServer } from "msw/node";
import testData from "./content-test-data.json";
import { env } from "./env/server";
import requestHandler from "./request-handler";
import UnleashService from "./unleash-service";

const req = (url: string, rest?: any) =>
new Request(url, {
headers: { Host: "localhost:8089" },
...rest,
});

const fetch = await requestHandler(new UnleashService({ mock: true }));
const fetch = await requestHandler();

test("is alive", async () => {
const response = await fetch(req("http://localhost/api/isAlive"));
expect(response.status).toBe(200);
expect(await response.text()).toBe("OK");
});

test("index", async () => {
const response = await fetch(req("http://localhost/"));
expect(response.status).toBe(200);
expect(response.headers.get("content-type")).toBe(
"text/html; charset=utf-8",
);
expect(await response.text()).toContain("<!doctype html>");
});

test("search", async () => {
const response = await fetch(req("http://localhost/api/search?q=test"));
expect(response.status).toBe(200);
expect(response.headers.get("content-type")).toBe(
"text/html; charset=utf-8",
);
});

describe("notifications", () => {
describe("request handler", () => {
let server: SetupServerApi;

beforeAll(() => {
server = setupServer(
http.get(`${env.ENONICXP_SERVICES}/no.nav.navno/menu`, () =>
HttpResponse.json(testData),
),
http.post(`${env.VARSEL_API_URL}/beskjed/inaktiver`, () =>
HttpResponse.json({ success: true }),
),
);
server.listen();
});
beforeEach(() => clearCache());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());

test("is alive", async () => {
const response = await fetch(req("http://localhost/api/isAlive"));
expect(response.status).toBe(200);
expect(await response.text()).toBe("OK");
});

test("index", async () => {
const response = await fetch(req("http://localhost/"));
expect(response.status).toBe(200);
expect(response.headers.get("content-type")).toBe(
"text/html; charset=utf-8",
);
expect(await response.text()).toContain("<!doctype html>");
});

test("search", async () => {
const response = await fetch(req("http://localhost/api/search?q=test"));
expect(response.status).toBe(200);
expect(response.headers.get("content-type")).toBe(
"text/html; charset=utf-8",
);
});

test("archive notification on POST", async () => {
const response = await fetch(
req("http://localhost/api/notifications/archive?id=eventId", {
Expand Down
12 changes: 5 additions & 7 deletions packages/server/src/request-handler.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { makeFrontpageUrl } from "decorator-shared/urls";
import { getMainMenuLinks, mainMenuContextLinks } from "./menu";
import { handleCors } from "./cors";
import { cspHandler } from "./csp";
import { csrHandler } from "./csr";
Expand All @@ -9,12 +8,13 @@ import { assetsHandlers } from "./handlers/assets-handler";
import { authHandler } from "./handlers/auth-handler";
import jsonIndex from "./json-index";
import { HandlerBuilder, responseBuilder } from "./lib/handler";
import { getMainMenuLinks, mainMenuContextLinks } from "./menu";
import { archiveNotification } from "./notifications";
import renderIndex, { renderFooter, renderHeader } from "./render-index";
import { searchHandler } from "./handlers/search-handler";
import { getTaskAnalyticsConfig } from "./task-analytics-config";
import { texts } from "./texts";
import UnleashService from "./unleash-service";
import { getFeatures } from "./unleash";
import { validParams } from "./validateParams";
import { MainMenu } from "./views/header/main-menu";

Expand All @@ -28,7 +28,7 @@ const rewriter = new HTMLRewriter().on("img", {
},
});

const requestHandler = async (unleashService: UnleashService) => {
const requestHandler = async () => {
const handlersBuilder = new HandlerBuilder()
.get("/api/ta", () =>
getTaskAnalyticsConfig().then((result) => {
Expand Down Expand Up @@ -110,7 +110,7 @@ const requestHandler = async (unleashService: UnleashService) => {
.get("/footer", async ({ query }) => {
const data = validParams(query);
const localTexts = texts[data.language];
const features = unleashService.getFeatures();
const features = getFeatures();
const footer = await renderFooter({
features,
texts: localTexts,
Expand All @@ -123,15 +123,13 @@ const requestHandler = async (unleashService: UnleashService) => {
})
.get("/scripts", async ({ query }) => {
const json = await jsonIndex({
unleashService,
data: validParams(query),
});

return responseBuilder().json(json).build();
})
.get("/", async ({ url, query }) => {
const index = await renderIndex({
unleashService,
data: validParams(query),
url: url.toString(),
});
Expand All @@ -141,7 +139,7 @@ const requestHandler = async (unleashService: UnleashService) => {
// Build header and footer for SSR
.use([
csrHandler({
features: unleashService.getFeatures(),
features: getFeatures(),
}),
])
.use(assetsHandlers)
Expand Down
3 changes: 1 addition & 2 deletions packages/server/src/server.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { env } from "./env/server";
import setupMocks from "./mocks";
import requestHandler from "./request-handler";
import UnleashService from "./unleash-service";

console.log("Starting decorator-next server");

Expand All @@ -13,7 +12,7 @@ if (env.NODE_ENV === "development") {
const server = Bun.serve({
port: 8089,
development: env.NODE_ENV === "development",
fetch: await requestHandler(new UnleashService({})),
fetch: await requestHandler(),
});

console.log(
Expand Down
Loading

0 comments on commit 86d322e

Please sign in to comment.