UNPKG

@dasch-swiss/dsp-js

Version:

JavaScript library that handles API requests to Knora

335 lines 24.1 kB
import { of } from "rxjs"; import { AjaxError } from "rxjs/ajax"; import { ListNodeV2Cache } from "../../../cache/ListNodeV2Cache"; import { OntologyCache } from "../../../cache/ontology-cache/OntologyCache"; import { MockList } from "../../../../test/data/api/v2/mock-list"; import { MockOntology } from "../../../../test/data/api/v2/mock-ontology"; import { MockAjaxCall } from "../../../../test/mockajaxcall"; import { KnoraApiConfig } from "../../../knora-api-config"; import { KnoraApiConnection } from "../../../knora-api-connection"; import { ApiResponseError } from "../../../models/api-response-error"; import { SearchEndpointV2 } from "./search-endpoint-v2"; describe("SearchEndpoint", function () { var config = new KnoraApiConfig("http", "0.0.0.0", 3333, undefined, "", true); var knoraApiConnection; var getResourceClassSpy; var getListNodeFromCacheSpy; beforeEach(function () { jasmine.Ajax.install(); // Mock cache methods at the prototype level // This ensures ALL cache instances (including temporary ones) get the mocks spyOn(OntologyCache.prototype, 'getResourceClassDefinition').and.callFake(function (resClassIri) { return of(MockOntology.mockIResourceClassAndPropertyDefinitions(resClassIri)); }); spyOn(ListNodeV2Cache.prototype, 'getNode').and.callFake(function (listNodeIri) { return of(MockList.mockNode(listNodeIri)); }); knoraApiConnection = new KnoraApiConnection(config); // Store references to the spies for test assertions getResourceClassSpy = OntologyCache.prototype.getResourceClassDefinition; getListNodeFromCacheSpy = ListNodeV2Cache.prototype.getNode; }); afterEach(function () { jasmine.Ajax.uninstall(); }); describe("Fulltext search", function () { it("should handle parameters correctly", function () { expect(SearchEndpointV2["encodeFulltextParams"](0)).toEqual("?offset=0"); expect(SearchEndpointV2["encodeFulltextParams"](1)).toEqual("?offset=1"); expect(SearchEndpointV2["encodeFulltextParams"](0, { limitToProject: "http://rdfh.ch/projects/0001" })) .toEqual("?offset=0&limitToProject=http%3A%2F%2Frdfh.ch%2Fprojects%2F0001"); expect(SearchEndpointV2["encodeFulltextParams"](0, { limitToResourceClass: "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing" })) .toEqual("?offset=0&limitToResourceClass=http%3A%2F%2F0.0.0.0%3A3333%2Fontology%2F0001%2Fanything%2Fv2%23Thing"); expect(SearchEndpointV2["encodeFulltextParams"](0, { limitToStandoffClass: "http://api.knora.org/ontology/standoff/v2#StandoffParagraphTag" })) .toEqual("?offset=0&limitToStandoffClass=http%3A%2F%2Fapi.knora.org%2Fontology%2Fstandoff%2Fv2%23StandoffParagraphTag"); expect(SearchEndpointV2["encodeFulltextParams"](0, { limitToProject: "http://rdfh.ch/projects/0001", limitToResourceClass: "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing" })) .toEqual("?offset=0&limitToResourceClass=http%3A%2F%2F0.0.0.0%3A3333%2Fontology%2F0001%2Fanything%2Fv2%23Thing&limitToProject=http%3A%2F%2Frdfh.ch%2Fprojects%2F0001"); expect(SearchEndpointV2["encodeFulltextParams"](0, { limitToProject: "http://rdfh.ch/projects/0001", limitToResourceClass: "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing", limitToStandoffClass: "http://api.knora.org/ontology/standoff/v2#StandoffParagraphTag" })) .toEqual("?offset=0&limitToResourceClass=http%3A%2F%2F0.0.0.0%3A3333%2Fontology%2F0001%2Fanything%2Fv2%23Thing&limitToProject=http%3A%2F%2Frdfh.ch%2Fprojects%2F0001&limitToStandoffClass=http%3A%2F%2Fapi.knora.org%2Fontology%2Fstandoff%2Fv2%23StandoffParagraphTag"); }); it("should do a fulltext search with a simple search term", function (done) { knoraApiConnection.v2.search.doFulltextSearch("thing", 0).subscribe(function (response) { expect(response.resources.length).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/resources/things.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url).toBe("http://0.0.0.0:3333/v2/search/thing?offset=0"); expect(request.method).toEqual("GET"); }); it("should unsuccessfully attempt to do a fulltext search with a simple search term", function (done) { knoraApiConnection.v2.search.doFulltextSearch("thing", 0).subscribe(function (response) { }, function (err) { expect(err instanceof ApiResponseError).toBeTruthy(); expect(err.status).toEqual(400); expect(err.error instanceof AjaxError).toBeTruthy(); done(); }); var request = jasmine.Ajax.requests.mostRecent(); request.respondWith(MockAjaxCall.mockBadRequestResponse()); expect(request.url).toBe("http://0.0.0.0:3333/v2/search/thing?offset=0"); expect(request.method).toEqual("GET"); }); it("should do a fulltext search with a simple search term using offset 1", function (done) { knoraApiConnection.v2.search.doFulltextSearch("thing", 1).subscribe(function (response) { expect(response.resources.length).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/resources/things.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url).toBe("http://0.0.0.0:3333/v2/search/thing?offset=1"); expect(request.method).toEqual("GET"); }); it("should do a fulltext search with a simple search term restricting the search to a specific resource class", function (done) { knoraApiConnection.v2.search.doFulltextSearch("thing", 1, { limitToResourceClass: "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing" }).subscribe(function (response) { expect(response.resources.length).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/resources/things.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url) .toEqual("http://0.0.0.0:3333/v2/search/thing?offset=1&limitToResourceClass=http%3A%2F%2F0.0.0.0%3A3333%2Fontology%2F0001%2Fanything%2Fv2%23Thing"); expect(request.method).toEqual("GET"); }); it("should do a fulltext search with a simple search term restricting the search to a specific project", function (done) { knoraApiConnection.v2.search.doFulltextSearch("thing", 1, { limitToProject: "http://rdfh.ch/projects/0001" }).subscribe(function (response) { expect(response.resources.length).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/resources/things.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url) .toEqual("http://0.0.0.0:3333/v2/search/thing?offset=1&limitToProject=http%3A%2F%2Frdfh.ch%2Fprojects%2F0001"); expect(request.method).toEqual("GET"); }); it("should do a fulltext search with a simple search term restricting the search to a specific standoff class", function (done) { knoraApiConnection.v2.search.doFulltextSearch("thing", 1, { limitToStandoffClass: "http://api.knora.org/ontology/standoff/v2#StandoffParagraphTag" }).subscribe(function (response) { expect(response.resources.length).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/resources/things.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url) .toEqual("http://0.0.0.0:3333/v2/search/thing?offset=1&limitToStandoffClass=http%3A%2F%2Fapi.knora.org%2Fontology%2Fstandoff%2Fv2%23StandoffParagraphTag"); expect(request.method).toEqual("GET"); }); }); it("should do a fulltext count search with a simple search term", function (done) { knoraApiConnection.v2.search.doFulltextSearchCountQuery("thing", 0).subscribe(function (response) { expect(response.numberOfResults).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/search/count-query-result.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url).toBe("http://0.0.0.0:3333/v2/search/count/thing?offset=0"); expect(request.method).toEqual("GET"); }); describe("Incoming links endpoint", function () { var resourceIri = "http://rdfh.ch/0001/a-thing"; it("should perform a successful incoming links search", function (done) { knoraApiConnection.v2.search.doSearchIncomingLinks(resourceIri).subscribe(function (response) { expect(response.resources.length).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/resources/things.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url).toBe("http://0.0.0.0:3333/v2/searchIncomingLinks/http%3A%2F%2Frdfh.ch%2F0001%2Fa-thing?offset=0"); expect(request.method).toEqual("GET"); }); }); describe("StillImageRepresentations endpoints", function () { var resourceIri = "http://rdfh.ch/0001/a-thing-picture"; it("should perform a successful StillImageRepresentations search", function (done) { knoraApiConnection.v2.search.doSearchStillImageRepresentations(resourceIri).subscribe(function (response) { expect(response.resources.length).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/resources/things.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url).toBe("http://0.0.0.0:3333/v2/searchStillImageRepresentations/http%3A%2F%2Frdfh.ch%2F0001%2Fa-thing-picture?offset=0"); expect(request.method).toEqual("GET"); }); it("should perform a successful StillImageRepresentationsCount search", function (done) { knoraApiConnection.v2.search.doSearchStillImageRepresentationsCount(resourceIri).subscribe(function (response) { expect(response.numberOfResults).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/search/count-query-result.json"); ; request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url).toBe("http://0.0.0.0:3333/v2/searchStillImageRepresentationsCount/http%3A%2F%2Frdfh.ch%2F0001%2Fa-thing-picture"); expect(request.method).toEqual("GET"); }); }); describe("Incoming regions endpoint", function () { var resourceIri = "http://rdfh.ch/0001/a-thing-picture"; it("should perform a successful incoming regions search", function (done) { knoraApiConnection.v2.search.doSearchIncomingRegions(resourceIri).subscribe(function (response) { expect(response.resources.length).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/resources/things.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url).toBe("http://0.0.0.0:3333/v2/searchIncomingRegions/http%3A%2F%2Frdfh.ch%2F0001%2Fa-thing-picture?offset=0"); expect(request.method).toEqual("GET"); }); }); describe("Extended search", function () { it("should perform an extended search", function (done) { var gravsearchQuery = "\n PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>\n CONSTRUCT {\n\n ?mainRes knora-api:isMainResource true .\n\n } WHERE {\n\n ?mainRes a knora-api:Resource .\n\n ?mainRes a <http://0.0.0.0:3333/ontology/0001/anything/v2#Thing> .\n }\n\n OFFSET 0\n "; knoraApiConnection.v2.search.doExtendedSearch(gravsearchQuery).subscribe(function (response) { expect(response.resources.length).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/resources/things.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url).toBe("http://0.0.0.0:3333/v2/searchextended"); expect(request.method).toEqual("POST"); expect(request.requestHeaders).toEqual({ "content-type": "application/sparql-query; charset=utf-8", "x-requested-with": "XMLHttpRequest" }); // https://github.com/jasmine/jasmine-ajax#5-inspect-ajax-requests // just check for the params because data() cannot handle this case expect(request.params).toEqual(gravsearchQuery); }); it("should unsuccessfully attempt to perform an extended search", function (done) { var gravsearchQuery = "\n PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>\n CONSTRUCT {\n\n ?mainRes knora-api:isMainResource true .\n\n } WHERE {\n\n ?mainRes a knora-api:Resource .\n\n ?mainRes a <http://0.0.0.0:3333/ontology/0001/anything/v2#Thing> .\n }\n\n OFFSET 0\n "; knoraApiConnection.v2.search.doExtendedSearch(gravsearchQuery).subscribe(function (response) { }, function (err) { expect(err instanceof ApiResponseError).toBeTruthy(); expect(err.status).toEqual(400); expect(err.error instanceof AjaxError).toBeTruthy(); done(); }); var request = jasmine.Ajax.requests.mostRecent(); request.respondWith(MockAjaxCall.mockBadRequestResponse()); expect(request.url).toBe("http://0.0.0.0:3333/v2/searchextended"); expect(request.method).toEqual("POST"); expect(request.requestHeaders).toEqual({ "content-type": "application/sparql-query; charset=utf-8", "x-requested-with": "XMLHttpRequest" }); // https://github.com/jasmine/jasmine-ajax#5-inspect-ajax-requests // just check for the params because data() cannot handle this case expect(request.params).toEqual(gravsearchQuery); }); it("should perform an extended search count query", function (done) { var gravsearchQuery = "\n PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>\n CONSTRUCT {\n\n ?mainRes knora-api:isMainResource true .\n\n } WHERE {\n\n ?mainRes a knora-api:Resource .\n\n ?mainRes a <http://0.0.0.0:3333/ontology/0001/anything/v2#Thing> .\n }\n\n OFFSET 0\n "; knoraApiConnection.v2.search.doExtendedSearchCountQuery(gravsearchQuery).subscribe(function (response) { expect(response.numberOfResults).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/search/count-query-result.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url).toBe("http://0.0.0.0:3333/v2/searchextended/count"); expect(request.method).toEqual("POST"); expect(request.requestHeaders).toEqual({ "content-type": "application/sparql-query; charset=utf-8", "x-requested-with": "XMLHttpRequest" }); // https://github.com/jasmine/jasmine-ajax#5-inspect-ajax-requests // just check for the params because data() cannot handle this case expect(request.params).toEqual(gravsearchQuery); }); it("should unsuccessfully attempt perform an extended search count query", function (done) { var gravsearchQuery = "\n PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>\n CONSTRUCT {\n\n ?mainRes knora-api:isMainResource true .\n\n } WHERE {\n\n ?mainRes a knora-api:Resource .\n\n ?mainRes a <http://0.0.0.0:3333/ontology/0001/anything/v2#Thing> .\n }\n\n OFFSET 0\n "; knoraApiConnection.v2.search.doExtendedSearchCountQuery(gravsearchQuery).subscribe(function (response) { }, function (err) { expect(err instanceof ApiResponseError).toBeTruthy(); expect(err.status).toEqual(400); expect(err.error instanceof AjaxError).toBeTruthy(); done(); }); var request = jasmine.Ajax.requests.mostRecent(); request.respondWith(MockAjaxCall.mockBadRequestResponse()); expect(request.url).toBe("http://0.0.0.0:3333/v2/searchextended/count"); expect(request.method).toEqual("POST"); expect(request.requestHeaders).toEqual({ "content-type": "application/sparql-query; charset=utf-8", "x-requested-with": "XMLHttpRequest" }); // https://github.com/jasmine/jasmine-ajax#5-inspect-ajax-requests // just check for the params because data() cannot handle this case expect(request.params).toEqual(gravsearchQuery); }); }); describe("Label search", function () { it("should handle parameters correctly", function () { expect(SearchEndpointV2["encodeLabelParams"](0)).toEqual("?offset=0"); expect(SearchEndpointV2["encodeLabelParams"](1)).toEqual("?offset=1"); expect(SearchEndpointV2["encodeLabelParams"](0, { limitToProject: "http://rdfh.ch/projects/0001" })) .toEqual("?offset=0&limitToProject=http%3A%2F%2Frdfh.ch%2Fprojects%2F0001"); expect(SearchEndpointV2["encodeLabelParams"](0, { limitToResourceClass: "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing" })) .toEqual("?offset=0&limitToResourceClass=http%3A%2F%2F0.0.0.0%3A3333%2Fontology%2F0001%2Fanything%2Fv2%23Thing"); expect(SearchEndpointV2["encodeLabelParams"](0, { limitToProject: "http://rdfh.ch/projects/0001", limitToResourceClass: "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing" })) .toEqual("?offset=0&limitToResourceClass=http%3A%2F%2F0.0.0.0%3A3333%2Fontology%2F0001%2Fanything%2Fv2%23Thing&limitToProject=http%3A%2F%2Frdfh.ch%2Fprojects%2F0001"); }); it("should do a label search with a simple search term", function (done) { knoraApiConnection.v2.search.doSearchByLabel("thing", 0).subscribe(function (response) { expect(response.resources.length).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/resources/things.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url).toBe("http://0.0.0.0:3333/v2/searchbylabel/thing?offset=0"); expect(request.method).toEqual("GET"); }); it("should unsuccessfully attempt to do a label search", function (done) { knoraApiConnection.v2.search.doSearchByLabel("thing", 0).subscribe(function (response) { }, function (err) { expect(err instanceof ApiResponseError).toBeTruthy(); expect(err.status).toEqual(400); expect(err.error instanceof AjaxError).toBeTruthy(); done(); }); var request = jasmine.Ajax.requests.mostRecent(); request.respondWith(MockAjaxCall.mockBadRequestResponse()); expect(request.url).toBe("http://0.0.0.0:3333/v2/searchbylabel/thing?offset=0"); expect(request.method).toEqual("GET"); }); it("should do a label search with a simple search term using offset 1", function (done) { knoraApiConnection.v2.search.doSearchByLabel("thing", 1).subscribe(function (response) { expect(response.resources.length).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/resources/things.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url).toBe("http://0.0.0.0:3333/v2/searchbylabel/thing?offset=1"); expect(request.method).toEqual("GET"); }); it("should do a label search with a simple search term restricting the search to a specific resource class", function (done) { knoraApiConnection.v2.search.doSearchByLabel("thing", 1, { limitToResourceClass: "http://0.0.0.0:3333/ontology/0001/anything/v2#Thing" }).subscribe(function (response) { expect(response.resources.length).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/resources/things.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url) .toEqual("http://0.0.0.0:3333/v2/searchbylabel/thing?offset=1&limitToResourceClass=http%3A%2F%2F0.0.0.0%3A3333%2Fontology%2F0001%2Fanything%2Fv2%23Thing"); expect(request.method).toEqual("GET"); }); it("should do a label search with a simple search term restricting the search to a specific project", function (done) { knoraApiConnection.v2.search.doSearchByLabel("thing", 1, { limitToProject: "http://rdfh.ch/projects/0001" }).subscribe(function (response) { expect(response.resources.length).toEqual(2); done(); }); var request = jasmine.Ajax.requests.mostRecent(); var resource = require("../../../../test/data/api/v2/resources/things.json"); request.respondWith(MockAjaxCall.mockResponse(JSON.stringify(resource))); expect(request.url) .toEqual("http://0.0.0.0:3333/v2/searchbylabel/thing?offset=1&limitToProject=http%3A%2F%2Frdfh.ch%2Fprojects%2F0001"); expect(request.method).toEqual("GET"); }); }); }); //# sourceMappingURL=search-endpoint.spec.js.map