@dasch-swiss/dsp-js
Version:
JavaScript library that handles API requests to Knora
335 lines • 24.1 kB
JavaScript
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