Skip to content

Commit c67724b

Browse files
committed
moved func out, escaped quotes, fixed tests
1 parent a28406f commit c67724b

File tree

2 files changed

+68
-24
lines changed

2 files changed

+68
-24
lines changed

packages/compass-indexes/src/components/create-index-form/mdb-code-viewer.spec.tsx

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,21 @@ import { expect } from 'chai';
55

66
describe('MDBCodeViewer', () => {
77
const dbName = 'testDB';
8-
const collectionName = 'testCollection';
9-
const indexNameTypeMap = {
8+
const defaultCollectionName = 'testCollection';
9+
const defaultIndexNameTypeMap = {
1010
field1: '1 (asc)',
1111
field2: '-1 (desc)',
1212
field3: '2dsphere',
1313
field4: 'text',
1414
};
1515

16-
const renderComponent = () => {
16+
const renderComponent = ({
17+
collectionName = defaultCollectionName,
18+
indexNameTypeMap = defaultIndexNameTypeMap,
19+
}: {
20+
collectionName?: string;
21+
indexNameTypeMap?: { [key: string]: string };
22+
}) => {
1723
render(
1824
<MDBCodeViewer
1925
dbName={dbName}
@@ -24,15 +30,26 @@ describe('MDBCodeViewer', () => {
2430
};
2531

2632
it('shows the db name, collection name, and field names, and field types', () => {
27-
renderComponent();
33+
renderComponent({});
2834
const codeElement = screen.getByTestId('mdb-code-viewer');
2935
expect(codeElement).to.have.text(
30-
'db.getSiblingDB("testDB").getCollection("testCollection").createIndex{( "field1": "1", "field2": "-1", "field3": "2dsphere", "field4": "text"});'
36+
'db.getSiblingDB("testDB").getCollection("testCollection").createIndex({ "field1": 1, "field2": -1, "field3": "2dsphere", "field4": "text"});'
37+
);
38+
});
39+
40+
it('shows the escaped version of collection name and field name when there are quotes', () => {
41+
renderComponent({
42+
collectionName: 'collection"With"quotes',
43+
indexNameTypeMap: { 'field"With"quotes': '1' },
44+
});
45+
const codeElement = screen.getByTestId('mdb-code-viewer');
46+
expect(codeElement).to.have.text(
47+
'db.getSiblingDB("testDB").getCollection("collection\\"With\\"quotes").createIndex({ "field\\"With\\"quotes": 1});'
3148
);
3249
});
3350

3451
it('renders the link to the MongoDB documentation', () => {
35-
renderComponent();
52+
renderComponent({});
3653
const linkElement = screen.getByText('here');
3754
expect(linkElement).to.be.visible;
3855
});

packages/compass-indexes/src/components/create-index-form/mdb-code-viewer.tsx

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,40 +11,67 @@ const programmingLanguageLinkStyles = css({
1111
marginTop: spacing[100],
1212
});
1313

14-
const MDBCodeViewer = ({
14+
const NUMERIC_INDEX_TYPES = [-1, 1];
15+
16+
const escapeText = (text: string) => {
17+
return text.replaceAll('"', '\\"');
18+
};
19+
20+
const generateCode = ({
1521
dbName,
1622
collectionName,
1723
indexNameTypeMap,
18-
dataTestId,
1924
}: {
2025
dbName: string;
2126
collectionName: string;
2227
indexNameTypeMap: { [key: string]: string };
23-
dataTestId?: string;
2428
}) => {
25-
const generateCode = () => {
26-
let codeStr = `db.getSiblingDB("${dbName}").getCollection("${collectionName}").createIndex{(\n`;
29+
let codeStr = `db.getSiblingDB("${dbName}").getCollection("${escapeText(
30+
collectionName
31+
)}").createIndex({\n`;
32+
33+
Object.entries(indexNameTypeMap).forEach(([name, type], index) => {
34+
// Replacing everything inside the parenthesis i.e. (asc)
35+
let parsedType = escapeText(type.replace(/\(.*?\)/g, '')).trim();
36+
if (!NUMERIC_INDEX_TYPES.includes(Number(parsedType))) {
37+
parsedType = `"${parsedType}"`;
38+
}
39+
const parsedName = escapeText(name).trim();
2740

28-
Object.entries(indexNameTypeMap).forEach(([name, type], index) => {
29-
// Replacing everything inside the parenthesis i.e. (asc)
30-
const parsedType = type.replace(/\(.*?\)/g, '').trim();
31-
codeStr += ` "${name}": "${parsedType}"`;
41+
codeStr += ` "${parsedName}": ${parsedType}`;
3242

33-
if (index !== Object.keys(indexNameTypeMap).length - 1) {
34-
codeStr += ',';
35-
}
43+
if (index !== Object.keys(indexNameTypeMap).length - 1) {
44+
codeStr += ',';
45+
}
3646

37-
codeStr += '\n';
38-
});
47+
codeStr += '\n';
48+
});
3949

40-
codeStr += `});`;
41-
return codeStr;
42-
};
50+
codeStr += `});`;
51+
return codeStr;
52+
};
53+
54+
const MDBCodeViewer = ({
55+
dbName,
56+
collectionName,
57+
indexNameTypeMap,
58+
dataTestId,
59+
}: {
60+
dbName: string;
61+
collectionName: string;
62+
indexNameTypeMap: { [key: string]: string };
63+
dataTestId?: string;
64+
}) => {
65+
const GeneratedCode = generateCode({
66+
dbName,
67+
collectionName,
68+
indexNameTypeMap,
69+
});
4370

4471
return (
4572
<div className={containerStyles}>
4673
<Code data-testid={dataTestId || 'mdb-code-viewer'} language="javascript">
47-
{generateCode()}
74+
{GeneratedCode}
4875
</Code>
4976
<span className={programmingLanguageLinkStyles}>
5077
View programming language driver syntax{' '}

0 commit comments

Comments
 (0)