@truedat/dd 8.4.8 → 8.4.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -6
- package/src/api/queries.js +3 -2
- package/src/components/ImplementationStructuresLoader.js +6 -5
- package/src/components/StructureSelectorInputField.js +4 -3
- package/src/components/__tests__/DictionaryRoutes.spec.js +2 -0
- package/src/components/__tests__/ImplementationStructuresLoader.spec.js +4 -1
- package/src/components/__tests__/__snapshots__/DictionaryRoutes.spec.js.snap +2 -39
- package/src/messages/en.js +4 -0
- package/src/messages/es.js +4 -0
- package/src/sagas/__tests__/legacyFetchStructure.spec.js +36 -0
- package/src/sagas/legacyFetchStructure.js +3 -2
- package/src/components/StructureSuggestions.js +0 -88
- package/src/components/__tests__/StructureSuggestions.spec.js +0 -93
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@truedat/dd",
|
|
3
|
-
"version": "8.4.
|
|
3
|
+
"version": "8.4.10",
|
|
4
4
|
"description": "Truedat Web Data Dictionary",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"module": "src/index.js",
|
|
@@ -51,22 +51,22 @@
|
|
|
51
51
|
"@testing-library/jest-dom": "^6.6.3",
|
|
52
52
|
"@testing-library/react": "^16.3.0",
|
|
53
53
|
"@testing-library/user-event": "^14.6.1",
|
|
54
|
-
"@truedat/test": "8.4.
|
|
54
|
+
"@truedat/test": "8.4.10",
|
|
55
55
|
"identity-obj-proxy": "^3.0.0",
|
|
56
56
|
"jest": "^29.7.0",
|
|
57
57
|
"redux-saga-test-plan": "^4.0.6"
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"@apollo/client": "^3.13.8",
|
|
61
|
-
"axios": "^1.15.
|
|
61
|
+
"axios": "^1.15.2",
|
|
62
62
|
"file-saver": "^2.0.5",
|
|
63
63
|
"graphql": "^16.11.0",
|
|
64
64
|
"is-hotkey": "^0.2.0",
|
|
65
65
|
"is-url": "^1.2.4",
|
|
66
|
-
"lodash": "^4.
|
|
66
|
+
"lodash": "^4.18.1",
|
|
67
67
|
"match-sorter": "^8.0.1",
|
|
68
68
|
"moment": "^2.30.1",
|
|
69
|
-
"path-to-regexp": "^8.
|
|
69
|
+
"path-to-regexp": "^8.4.0",
|
|
70
70
|
"prop-types": "^15.8.1",
|
|
71
71
|
"query-string": "^7.1.3",
|
|
72
72
|
"react": "^19.1.0",
|
|
@@ -86,5 +86,5 @@
|
|
|
86
86
|
"svg-pan-zoom": "^3.6.2",
|
|
87
87
|
"swr": "^2.3.3"
|
|
88
88
|
},
|
|
89
|
-
"gitHead": "
|
|
89
|
+
"gitHead": "f04300ddda49a4cf5da0bcba783ff56d192faaf4"
|
|
90
90
|
}
|
package/src/api/queries.js
CHANGED
|
@@ -243,6 +243,7 @@ export const LEGACY_DATA_STRUCTURE_VERSION_QUERY = gql`
|
|
|
243
243
|
$dataStructureId: ID!
|
|
244
244
|
$version: String!
|
|
245
245
|
$note_fields: [String]
|
|
246
|
+
$withoutGrants: Boolean!
|
|
246
247
|
) {
|
|
247
248
|
dataStructureVersion(dataStructureId: $dataStructureId, version: $version) {
|
|
248
249
|
id
|
|
@@ -324,7 +325,7 @@ export const LEGACY_DATA_STRUCTURE_VERSION_QUERY = gql`
|
|
|
324
325
|
}
|
|
325
326
|
ancestry
|
|
326
327
|
|
|
327
|
-
grants {
|
|
328
|
+
grants @skip(if: $withoutGrants) {
|
|
328
329
|
data_structure {
|
|
329
330
|
external_id
|
|
330
331
|
id
|
|
@@ -355,7 +356,7 @@ export const LEGACY_DATA_STRUCTURE_VERSION_QUERY = gql`
|
|
|
355
356
|
}
|
|
356
357
|
user_id
|
|
357
358
|
}
|
|
358
|
-
grant {
|
|
359
|
+
grant @skip(if: $withoutGrants) {
|
|
359
360
|
data_structure {
|
|
360
361
|
external_id
|
|
361
362
|
id
|
|
@@ -14,7 +14,7 @@ export const ImplementationStructuresLoader = ({
|
|
|
14
14
|
const structures = _.flow(
|
|
15
15
|
_.concat(structuresFields),
|
|
16
16
|
_.map(_.toInteger),
|
|
17
|
-
_.uniq
|
|
17
|
+
_.uniq,
|
|
18
18
|
)(structuresSiblings);
|
|
19
19
|
const [structureIndex, setStructureIndex] = useState(0);
|
|
20
20
|
const [requestedStructures, setRequestedStructures] = useState([]);
|
|
@@ -23,7 +23,7 @@ export const ImplementationStructuresLoader = ({
|
|
|
23
23
|
// check structure_ids, will be undefined if structureIds is an empty Array
|
|
24
24
|
if (structure_id && !_.includes(structure_id)(structures)) {
|
|
25
25
|
if (!_.includes(structure_id)(requestedStructures)) {
|
|
26
|
-
legacyFetchStructure({ id: structure_id });
|
|
26
|
+
legacyFetchStructure({ id: structure_id, withoutGrants: true });
|
|
27
27
|
setRequestedStructures([...requestedStructures, structure_id]);
|
|
28
28
|
}
|
|
29
29
|
} else if (structureIndex + 1 < _.size(structureIds)) {
|
|
@@ -57,6 +57,7 @@ export const mapStateToProps = ({ structuresFields, structuresSiblings }) => ({
|
|
|
57
57
|
structuresSiblings: _.keys(structuresSiblings),
|
|
58
58
|
});
|
|
59
59
|
|
|
60
|
-
export default connect(mapStateToProps, {
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
export default connect(mapStateToProps, {
|
|
61
|
+
legacyFetchStructure,
|
|
62
|
+
clearStructure,
|
|
63
|
+
})(ImplementationStructuresLoader);
|
|
@@ -25,7 +25,8 @@ export const StructureSelectorInputField = ({
|
|
|
25
25
|
}) => {
|
|
26
26
|
const { formatMessage } = useIntl();
|
|
27
27
|
const handleSelectStructure = (value) => {
|
|
28
|
-
value &&
|
|
28
|
+
value &&
|
|
29
|
+
legacyFetchStructure({ id: _.prop("id")(value), withoutGrants: true });
|
|
29
30
|
value && onChange(value);
|
|
30
31
|
};
|
|
31
32
|
|
|
@@ -40,7 +41,7 @@ export const StructureSelectorInputField = ({
|
|
|
40
41
|
const aliasIsNeeded =
|
|
41
42
|
_.flow(
|
|
42
43
|
_.map(_.path("structure.id")),
|
|
43
|
-
_.filter((s) => s === selectedStructure?.structure?.id)
|
|
44
|
+
_.filter((s) => s === selectedStructure?.structure?.id),
|
|
44
45
|
)(structures).length > 1;
|
|
45
46
|
|
|
46
47
|
return (
|
|
@@ -140,5 +141,5 @@ StructureSelectorInputField.propTypes = {
|
|
|
140
141
|
};
|
|
141
142
|
|
|
142
143
|
export default connect(null, { legacyFetchStructure })(
|
|
143
|
-
StructureSelectorInputField
|
|
144
|
+
StructureSelectorInputField,
|
|
144
145
|
);
|
|
@@ -28,6 +28,8 @@ jest.mock("@truedat/core/components/SystemsLoader", () => () => (
|
|
|
28
28
|
jest.mock("@truedat/core/components/TemplatesLoader", () => () => (
|
|
29
29
|
<div>TemplatesLoader</div>
|
|
30
30
|
));
|
|
31
|
+
jest.mock("@truedat/core/components/UploadJobs", () => () => <div>UploadJobs</div>);
|
|
32
|
+
jest.mock("@truedat/core/components/UploadJob", () => () => <div>UploadJob</div>);
|
|
31
33
|
|
|
32
34
|
jest.mock("../CatalogViewConfigs", () => () => <div>CatalogViewConfigs</div>);
|
|
33
35
|
jest.mock("../CatalogViewConfigForm", () => ({
|
|
@@ -11,7 +11,10 @@ describe("<ImplementationStructuresLoader/>", () => {
|
|
|
11
11
|
const { unmount } = render(<ImplementationStructuresLoader {...props} />);
|
|
12
12
|
expect(props.clearStructure).toHaveBeenCalledTimes(0);
|
|
13
13
|
expect(props.legacyFetchStructure).toHaveBeenCalledTimes(1);
|
|
14
|
-
expect(props.legacyFetchStructure).toHaveBeenCalledWith({
|
|
14
|
+
expect(props.legacyFetchStructure).toHaveBeenCalledWith({
|
|
15
|
+
id: 42,
|
|
16
|
+
withoutGrants: true,
|
|
17
|
+
});
|
|
15
18
|
|
|
16
19
|
unmount();
|
|
17
20
|
expect(props.clearStructure).toHaveBeenCalledTimes(1);
|
|
@@ -120,45 +120,8 @@ exports[`<DictionaryRoutes /> renders correctly with structures route 1`] = `
|
|
|
120
120
|
|
|
121
121
|
exports[`<DictionaryRoutes /> renders correctly with structures upload events route 1`] = `
|
|
122
122
|
<div>
|
|
123
|
-
<div
|
|
124
|
-
|
|
125
|
-
>
|
|
126
|
-
<a
|
|
127
|
-
class="section"
|
|
128
|
-
data-discover="true"
|
|
129
|
-
href="/structureNotes/uploadJobs"
|
|
130
|
-
>
|
|
131
|
-
uploadJobs.notes.header
|
|
132
|
-
</a>
|
|
133
|
-
</div>
|
|
134
|
-
<div
|
|
135
|
-
class="ui segment"
|
|
136
|
-
>
|
|
137
|
-
<h2
|
|
138
|
-
class="ui header"
|
|
139
|
-
>
|
|
140
|
-
<i
|
|
141
|
-
aria-hidden="true"
|
|
142
|
-
class="cogs circular icon"
|
|
143
|
-
/>
|
|
144
|
-
<div
|
|
145
|
-
class="content"
|
|
146
|
-
>
|
|
147
|
-
uploadJobs.notes.header
|
|
148
|
-
<div
|
|
149
|
-
class="sub header"
|
|
150
|
-
>
|
|
151
|
-
uploadJobs.subheader
|
|
152
|
-
</div>
|
|
153
|
-
</div>
|
|
154
|
-
</h2>
|
|
155
|
-
<div
|
|
156
|
-
class="dimmable"
|
|
157
|
-
>
|
|
158
|
-
<div
|
|
159
|
-
class="ui bottom attached segment"
|
|
160
|
-
/>
|
|
161
|
-
</div>
|
|
123
|
+
<div>
|
|
124
|
+
UploadJobs
|
|
162
125
|
</div>
|
|
163
126
|
</div>
|
|
164
127
|
`;
|
package/src/messages/en.js
CHANGED
|
@@ -397,7 +397,11 @@ export default {
|
|
|
397
397
|
"structure.rule.props.name": "Name",
|
|
398
398
|
"structure.rule_implementation.props.key": "Implementation",
|
|
399
399
|
"structure.rule_implementation.props.result": "Quality",
|
|
400
|
+
"structure.reason": "Reason",
|
|
400
401
|
"structure.search.placeholder": "Enter a search...",
|
|
402
|
+
"structure.similarity": "Similarity",
|
|
403
|
+
"suggestions.similarity.cosine.popup":
|
|
404
|
+
"Similarity score (cosine). Higher values indicate a closer match.",
|
|
401
405
|
"structure.share.title": "Share structure",
|
|
402
406
|
"structure.system": "System",
|
|
403
407
|
"structure.system.create": "Create system",
|
package/src/messages/es.js
CHANGED
|
@@ -407,7 +407,11 @@ export default {
|
|
|
407
407
|
"structure.rule.props.name": "Nombre",
|
|
408
408
|
"structure.rule_implementation.props.key": "Implementación",
|
|
409
409
|
"structure.rule_implementation.props.result": "Calidad",
|
|
410
|
+
"structure.reason": "Motivo",
|
|
410
411
|
"structure.search.placeholder": "Introduce una busqueda...",
|
|
412
|
+
"structure.similarity": "Similitud",
|
|
413
|
+
"suggestions.similarity.cosine.popup":
|
|
414
|
+
"Puntuación de similitud (coseno). Valores más altos indican mayor coincidencia.",
|
|
411
415
|
"structure.share.title": "Compartir estructura",
|
|
412
416
|
"structure.system": "Sistema",
|
|
413
417
|
"structure.system.create": "Crear sistema",
|
|
@@ -37,6 +37,7 @@ describe("sagas: legacyFetchStructureSaga", () => {
|
|
|
37
37
|
dataStructureId: id,
|
|
38
38
|
version,
|
|
39
39
|
note_fields: ["note_field"],
|
|
40
|
+
withoutGrants: false,
|
|
40
41
|
};
|
|
41
42
|
|
|
42
43
|
const structureFieldColumns = [{ name: "id" }, { name: "note.note_field" }];
|
|
@@ -94,6 +95,41 @@ describe("sagas: legacyFetchStructureSaga", () => {
|
|
|
94
95
|
dataStructureId: id,
|
|
95
96
|
version,
|
|
96
97
|
note_fields: ["note_field"],
|
|
98
|
+
withoutGrants: false,
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
expect(() => {
|
|
102
|
+
testSaga(legacyFetchStructureSaga, { payload })
|
|
103
|
+
.next()
|
|
104
|
+
.select(getStructureFieldColumns)
|
|
105
|
+
.next(structureFieldColumns)
|
|
106
|
+
.getContext("client")
|
|
107
|
+
.next(client)
|
|
108
|
+
.put(legacyFetchStructure.request())
|
|
109
|
+
.next()
|
|
110
|
+
.call(client.query, {
|
|
111
|
+
fetchPolicy: "network-only",
|
|
112
|
+
query: LEGACY_DATA_STRUCTURE_VERSION_QUERY,
|
|
113
|
+
variables,
|
|
114
|
+
})
|
|
115
|
+
.next({ data: { dataStructureVersion } })
|
|
116
|
+
.put({ meta, ...legacyFetchStructure.success(data) })
|
|
117
|
+
.next()
|
|
118
|
+
.put(legacyFetchStructure.fulfill())
|
|
119
|
+
.next()
|
|
120
|
+
.isDone();
|
|
121
|
+
}).not.toThrow();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("should forward withoutGrants when set in payload", () => {
|
|
125
|
+
const payload = { id, withoutGrants: true };
|
|
126
|
+
const meta = { version };
|
|
127
|
+
|
|
128
|
+
const variables = {
|
|
129
|
+
dataStructureId: id,
|
|
130
|
+
version,
|
|
131
|
+
note_fields: ["note_field"],
|
|
132
|
+
withoutGrants: true,
|
|
97
133
|
};
|
|
98
134
|
|
|
99
135
|
expect(() => {
|
|
@@ -9,14 +9,14 @@ export function* legacyFetchStructureSaga({ payload }) {
|
|
|
9
9
|
const structureFieldColumns = yield select(getStructureFieldColumns);
|
|
10
10
|
const note_fields = _.flow(
|
|
11
11
|
_.filter(({ name }) => name.startsWith("note.")),
|
|
12
|
-
_.map(({ name }) => name.split(".")[1])
|
|
12
|
+
_.map(({ name }) => name.split(".")[1]),
|
|
13
13
|
)(structureFieldColumns);
|
|
14
14
|
|
|
15
15
|
const client = yield getContext("client");
|
|
16
16
|
|
|
17
17
|
yield put(legacyFetchStructure.request());
|
|
18
18
|
|
|
19
|
-
const { id, version = "latest" } = payload;
|
|
19
|
+
const { id, version = "latest", withoutGrants = false } = payload;
|
|
20
20
|
const {
|
|
21
21
|
data: { dataStructureVersion },
|
|
22
22
|
} = yield call(client.query, {
|
|
@@ -26,6 +26,7 @@ export function* legacyFetchStructureSaga({ payload }) {
|
|
|
26
26
|
dataStructureId: id,
|
|
27
27
|
version,
|
|
28
28
|
note_fields,
|
|
29
|
+
withoutGrants,
|
|
29
30
|
},
|
|
30
31
|
});
|
|
31
32
|
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import _ from "lodash/fp";
|
|
2
|
-
import React, { useEffect } from "react";
|
|
3
|
-
import { Popup } from "semantic-ui-react";
|
|
4
|
-
import { useIntl } from "react-intl";
|
|
5
|
-
import { useParams } from "react-router";
|
|
6
|
-
import { useSelector } from "react-redux";
|
|
7
|
-
import PropTypes from "prop-types";
|
|
8
|
-
import { useDataStructureSuggestions } from "../hooks/useStructures";
|
|
9
|
-
import { defaultColumnsForStructureSelector } from "../selectors";
|
|
10
|
-
import StructuresSearchResults from "./StructuresSearchResults";
|
|
11
|
-
|
|
12
|
-
const SimilarityColumn = (similarity) => {
|
|
13
|
-
const { formatMessage } = useIntl();
|
|
14
|
-
return (
|
|
15
|
-
<Popup
|
|
16
|
-
content={formatMessage({ id: "suggestions.similarity.cosine.popup" })}
|
|
17
|
-
trigger={<span>{similarity.toFixed(3)}</span>}
|
|
18
|
-
/>
|
|
19
|
-
);
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
const similarityColumnDefinition = {
|
|
23
|
-
name: "similarity",
|
|
24
|
-
fieldSelector: _.prop("similarity"),
|
|
25
|
-
fieldDecorator: SimilarityColumn,
|
|
26
|
-
width: 1,
|
|
27
|
-
};
|
|
28
|
-
const suggestionColumns = (state) =>
|
|
29
|
-
_.concat(defaultColumnsForStructureSelector(state))([
|
|
30
|
-
similarityColumnDefinition,
|
|
31
|
-
]);
|
|
32
|
-
|
|
33
|
-
export const StructureSuggestions = ({
|
|
34
|
-
selectedStructure,
|
|
35
|
-
handleSelectedStructure,
|
|
36
|
-
selectable,
|
|
37
|
-
}) => {
|
|
38
|
-
const { business_concept_id: id, id: version } = useParams();
|
|
39
|
-
const { conceptLinks, columns } = useSelector((state) => ({
|
|
40
|
-
conceptLinks: state.conceptLinks,
|
|
41
|
-
columns: suggestionColumns(state),
|
|
42
|
-
}));
|
|
43
|
-
|
|
44
|
-
const {
|
|
45
|
-
trigger: fetchSuggestions,
|
|
46
|
-
data,
|
|
47
|
-
isMutating,
|
|
48
|
-
} = useDataStructureSuggestions();
|
|
49
|
-
|
|
50
|
-
useEffect(() => {
|
|
51
|
-
if (id && version && conceptLinks) {
|
|
52
|
-
fetchSuggestions({
|
|
53
|
-
resource: {
|
|
54
|
-
id,
|
|
55
|
-
version,
|
|
56
|
-
type: "concepts",
|
|
57
|
-
links: _.filter(
|
|
58
|
-
({ resource_type }) => resource_type == "data_structure"
|
|
59
|
-
)(conceptLinks),
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
}, [id, version, conceptLinks]);
|
|
64
|
-
|
|
65
|
-
const structures = data?.data?.data || [];
|
|
66
|
-
|
|
67
|
-
return (
|
|
68
|
-
<StructuresSearchResults
|
|
69
|
-
loading={isMutating}
|
|
70
|
-
columns={columns}
|
|
71
|
-
size="small"
|
|
72
|
-
structures={structures}
|
|
73
|
-
selectedStructure={selectedStructure}
|
|
74
|
-
onSelect={handleSelectedStructure}
|
|
75
|
-
labelResults={false}
|
|
76
|
-
pagination={false}
|
|
77
|
-
selectable={selectable}
|
|
78
|
-
/>
|
|
79
|
-
);
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
StructureSuggestions.propTypes = {
|
|
83
|
-
handleSelectedStructure: PropTypes.func,
|
|
84
|
-
selectedStructure: PropTypes.object,
|
|
85
|
-
selectable: PropTypes.bool,
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
export default StructureSuggestions;
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { render, screen } from "@testing-library/react";
|
|
3
|
-
import { useSelector } from "react-redux";
|
|
4
|
-
import { useParams } from "react-router";
|
|
5
|
-
import { useDataStructureSuggestions } from "../../hooks/useStructures";
|
|
6
|
-
import StructureSuggestions from "../StructureSuggestions";
|
|
7
|
-
import StructuresSearchResults from "../StructuresSearchResults";
|
|
8
|
-
import * as selectors from "../../selectors";
|
|
9
|
-
|
|
10
|
-
jest.mock("react-router", () => ({
|
|
11
|
-
useParams: jest.fn(),
|
|
12
|
-
}));
|
|
13
|
-
|
|
14
|
-
jest.mock("react-redux", () => ({
|
|
15
|
-
useSelector: jest.fn(),
|
|
16
|
-
}));
|
|
17
|
-
|
|
18
|
-
jest.mock("../../hooks/useStructures", () => ({
|
|
19
|
-
useDataStructureSuggestions: jest.fn(),
|
|
20
|
-
}));
|
|
21
|
-
|
|
22
|
-
jest.mock("../StructuresSearchResults", () => jest.fn(() => <div>MockSearchResults</div>));
|
|
23
|
-
|
|
24
|
-
jest.mock("../../selectors", () => ({
|
|
25
|
-
defaultColumnsForStructureSelector: jest.fn(),
|
|
26
|
-
}));
|
|
27
|
-
|
|
28
|
-
describe("StructureSuggestions", () => {
|
|
29
|
-
const mockFetchSuggestions = jest.fn();
|
|
30
|
-
|
|
31
|
-
beforeEach(() => {
|
|
32
|
-
jest.clearAllMocks();
|
|
33
|
-
|
|
34
|
-
selectors.defaultColumnsForStructureSelector.mockReturnValue([
|
|
35
|
-
{ name: "name", fieldSelector: (x) => x.name },
|
|
36
|
-
]);
|
|
37
|
-
|
|
38
|
-
useParams.mockReturnValue({ business_concept_id: "123", id: "456" });
|
|
39
|
-
|
|
40
|
-
useSelector.mockImplementation((selectorFn) =>
|
|
41
|
-
selectorFn({
|
|
42
|
-
conceptLinks: [
|
|
43
|
-
{ resource_type: "data_structure", id: "ds1" },
|
|
44
|
-
{ resource_type: "other", id: "not-ds" },
|
|
45
|
-
],
|
|
46
|
-
// mock of defaultColumnsForStructureSelector + similarity column
|
|
47
|
-
columns: [
|
|
48
|
-
{ name: "name", fieldSelector: (x) => x.name },
|
|
49
|
-
{ name: "similarity", fieldSelector: (x) => x.similarity },
|
|
50
|
-
],
|
|
51
|
-
})
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
useDataStructureSuggestions.mockReturnValue({
|
|
55
|
-
trigger: mockFetchSuggestions,
|
|
56
|
-
data: {
|
|
57
|
-
data: {
|
|
58
|
-
data: [
|
|
59
|
-
{ id: "structure1", similarity: 0.89 },
|
|
60
|
-
{ id: "structure2", similarity: 0.77 },
|
|
61
|
-
],
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
isMutating: false,
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it("calls fetchSuggestions on mount with correct parameters", () => {
|
|
69
|
-
render(<StructureSuggestions selectedStructure={null} handleSelectedStructure={jest.fn()} selectable={true} />);
|
|
70
|
-
|
|
71
|
-
expect(mockFetchSuggestions).toHaveBeenCalledWith({
|
|
72
|
-
resource: {
|
|
73
|
-
id: "123",
|
|
74
|
-
version: "456",
|
|
75
|
-
type: "concepts",
|
|
76
|
-
links: [{ resource_type: "data_structure", id: "ds1" }],
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it("renders StructuresSearchResults with props", () => {
|
|
82
|
-
render(<StructureSuggestions selectedStructure={{}} handleSelectedStructure={jest.fn()} selectable={false} />);
|
|
83
|
-
|
|
84
|
-
expect(screen.getByText("MockSearchResults")).toBeInTheDocument();
|
|
85
|
-
const props = StructuresSearchResults.mock.calls[0][0];
|
|
86
|
-
expect(props.structures).toEqual([
|
|
87
|
-
{ id: "structure1", similarity: 0.89 },
|
|
88
|
-
{ id: "structure2", similarity: 0.77 },
|
|
89
|
-
]);
|
|
90
|
-
expect(props.loading).toBe(false);
|
|
91
|
-
expect(props.selectable).toBe(false);
|
|
92
|
-
});
|
|
93
|
-
});
|