Skip to content

Commit de0a4f4

Browse files
committed
add create-templates tests
1 parent cdbb396 commit de0a4f4

File tree

8 files changed

+87
-27
lines changed

8 files changed

+87
-27
lines changed

packages/devtools-connect/src/oidc/handler.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import type { RedirectServerRequestInfo } from '@mongodb-js/oidc-plugin';
22
import type { DevtoolsConnectOptions } from '../connect';
3-
import { getStaticPage, StaticPage } from '@mongodb-js/oidc-http-server-pages';
3+
import {
4+
getStaticPage,
5+
HttpServerPage,
6+
} from '@mongodb-js/oidc-http-server-pages';
47

58
export function oidcServerRequestHandler(
69
options: Pick<DevtoolsConnectOptions, 'productDocsLink' | 'productName'>,
@@ -28,15 +31,15 @@ export function oidcServerRequestHandler(
2831
switch (result) {
2932
case 'accepted':
3033
res.end(
31-
getStaticPage(StaticPage.OIDCAcceptedPage, {
34+
getStaticPage(HttpServerPage.OIDCAcceptedPage, {
3235
productDocsLink,
3336
productName,
3437
})
3538
);
3639
break;
3740
case 'rejected':
3841
res.end(
39-
getStaticPage(StaticPage.OIDCErrorPage, {
42+
getStaticPage(HttpServerPage.OIDCErrorPage, {
4043
productDocsLink,
4144
productName,
4245
error: info.error,
@@ -47,7 +50,7 @@ export function oidcServerRequestHandler(
4750
break;
4851
default:
4952
res.end(
50-
getStaticPage(StaticPage.OIDCNotFoundPage, {
53+
getStaticPage(HttpServerPage.OIDCNotFoundPage, {
5154
productDocsLink,
5255
productName,
5356
})
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import React from 'react';
2+
import { expect } from 'chai';
3+
import { H1 } from '@mongodb-js/compass-components';
4+
import { generateTemplates } from './create-templates';
5+
6+
describe('generateTemplates', function () {
7+
enum TestPage {
8+
Page1 = 'Page1',
9+
}
10+
function Component1({ prop1, prop2 }: { prop1?: string; prop2?: string }) {
11+
return (
12+
<div>
13+
<H1>{prop1 || 'default'}</H1>
14+
{prop2 && <p data-attr={prop2}>{prop2}</p>}
15+
</div>
16+
);
17+
}
18+
19+
let result;
20+
before(function () {
21+
result = generateTemplates<TestPage>({
22+
[TestPage.Page1]: {
23+
Component: Component1,
24+
parameters: ['prop1', 'prop2'],
25+
},
26+
});
27+
});
28+
29+
it('creates 4 templates for Page1', function () {
30+
expect(result).to.have.own.property(TestPage.Page1);
31+
expect(result[TestPage.Page1]).to.have.length(4);
32+
});
33+
34+
it('includes a template with placeholders for prop1 + prop2', function () {
35+
const templates = result[TestPage.Page1];
36+
const fullTemplate = templates.find(
37+
({ parameters }) =>
38+
Object.keys(parameters).includes('prop1') &&
39+
Object.keys(parameters).includes('prop2')
40+
);
41+
expect(fullTemplate).to.exist;
42+
expect(fullTemplate).to.have.own.property('html');
43+
expect(fullTemplate.html).to.contain('{{prop:prop1}}');
44+
expect(fullTemplate.html).to.contain('{{prop:prop2}}');
45+
});
46+
47+
it('includes a template with placeholders for no props', function () {
48+
const templates = result[TestPage.Page1];
49+
const fullTemplate = templates.find(
50+
({ parameters }) => Object.keys(parameters).length === 0
51+
);
52+
expect(fullTemplate).to.exist;
53+
expect(fullTemplate).to.have.own.property('html');
54+
expect(fullTemplate.html).not.to.contain('{{prop:prop1}}');
55+
expect(fullTemplate.html).not.to.contain('{{prop:prop2}}');
56+
});
57+
});

packages/oidc-http-server-pages/src/create-templates.ts

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
} from './pages-source';
1818
import React from 'react';
1919
import type { PageTemplates, ITemplate } from './types';
20-
import { Page } from './types';
20+
import { HttpServerPage } from './types';
2121

2222
/** Iterate all sub-arrays of an array */
2323
function* allSubsets<T>(array: T[]): Iterable<T[]> {
@@ -36,17 +36,15 @@ function placeholder(prop: string): string {
3636
return `{{prop:${prop}}}`;
3737
}
3838

39-
type Component<PropNames extends string> = React.FunctionComponent<
40-
Partial<Record<PropNames, string>>
41-
> & {
39+
type Component = React.FunctionComponent<Partial<Record<string, string>>> & {
4240
name: string;
4341
};
4442

45-
function getPageTemplates<PropNames extends string>({
43+
function getPageTemplates({
4644
Component,
4745
parameters,
4846
}: {
49-
Component: Component<PropNames>;
47+
Component: Component;
5048
parameters: string[];
5149
}): ITemplate[] {
5250
const templates: ITemplate[] = [];
@@ -66,30 +64,30 @@ function getPageTemplates<PropNames extends string>({
6664
return templates;
6765
}
6866

69-
function generateTemplates<PropNames extends string>(
67+
export function generateTemplates<TPage extends string = HttpServerPage>(
7068
pages: Record<
71-
Page,
69+
TPage,
7270
{
73-
Component: Component<PropNames>;
71+
Component: Component;
7472
parameters: string[];
7573
}
7674
>
77-
): PageTemplates {
78-
const templates: Partial<PageTemplates> = {};
79-
for (const pageName of Object.keys(pages) as Page[]) {
75+
): PageTemplates<TPage> {
76+
const templates: Partial<PageTemplates<TPage>> = {};
77+
for (const pageName of Object.keys(pages) as TPage[]) {
8078
const { Component, parameters } = pages[pageName];
8179
const PageTemplates = getPageTemplates({ Component, parameters });
8280
templates[pageName] = PageTemplates;
8381
}
84-
return templates as PageTemplates;
82+
return templates as PageTemplates<TPage>;
8583
}
8684

8785
if (require.main === module) {
8886
// eslint-disable-next-line no-console
8987
console.log(
9088
JSON.stringify(
9189
generateTemplates({
92-
[Page.OIDCErrorPage]: {
90+
[HttpServerPage.OIDCErrorPage]: {
9391
Component: OIDCErrorPage,
9492
parameters: [
9593
'error',
@@ -99,11 +97,11 @@ if (require.main === module) {
9997
'productName',
10098
],
10199
},
102-
[Page.OIDCAcceptedPage]: {
100+
[HttpServerPage.OIDCAcceptedPage]: {
103101
Component: OIDCAcceptedPage,
104102
parameters: ['productDocsLink', 'productName'],
105103
},
106-
[Page.OIDCNotFoundPage]: {
104+
[HttpServerPage.OIDCNotFoundPage]: {
107105
Component: OIDCNotFoundPage,
108106
parameters: ['productDocsLink', 'productName'],
109107
},

packages/oidc-http-server-pages/src/get-static-page.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ITemplate, Page } from './types';
1+
import type { ITemplate, HttpServerPage } from './types';
22
import templates from './templates.json';
33

44
function findTemplate(templates: ITemplate[], parameterKeys: string[]) {
@@ -32,7 +32,7 @@ function escapeHTML(str: string) {
3232
}
3333

3434
export function getStaticPage(
35-
page: Page,
35+
page: HttpServerPage,
3636
parameters: Record<string, string | undefined>
3737
) {
3838
const pageTemplates = templates[page];
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
export { getStaticPage } from './get-static-page';
2-
export { Page as StaticPage } from './types';
2+
export { HttpServerPage } from './types';

packages/oidc-http-server-pages/src/templates.d.json.ts renamed to packages/oidc-http-server-pages/src/templates.json.d.ts

File renamed without changes.

packages/oidc-http-server-pages/src/types.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ export interface ITemplate {
22
parameters: Record<string, string>;
33
html: string;
44
}
5-
export type PageTemplates = Record<Page, ITemplate[]>;
5+
export type PageTemplates<TPage extends string = HttpServerPage> = Record<
6+
TPage,
7+
ITemplate[]
8+
>;
69

7-
export enum Page {
10+
export enum HttpServerPage {
811
OIDCErrorPage = 'OIDCErrorPage',
912
OIDCAcceptedPage = 'OIDCAcceptedPage',
1013
OIDCNotFoundPage = 'OIDCNotFoundPage',

packages/oidc-http-server-pages/tsconfig.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
"compilerOptions": {
44
"outDir": "dist",
55
"allowJs": true,
6-
"jsx": "react",
7-
"allowArbitraryExtensions": true
6+
"jsx": "react"
87
},
98
"include": ["src/**/*"],
109
"exclude": ["./src/**/*.spec.*"]

0 commit comments

Comments
 (0)