@internetarchive/metadata-service 0.0.1-alpha.1
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/.editorconfig +29 -0
- package/.eslintrc.js +14 -0
- package/.github/workflows/ci.yml +26 -0
- package/LICENSE +661 -0
- package/README.md +64 -0
- package/demo/app-root.ts +80 -0
- package/demo/index.html +27 -0
- package/dist/demo/app-root.d.ts +11 -0
- package/dist/demo/app-root.js +71 -0
- package/dist/demo/app-root.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/src/backend/default-metadata-backend.d.ts +27 -0
- package/dist/src/backend/default-metadata-backend.js +101 -0
- package/dist/src/backend/default-metadata-backend.js.map +1 -0
- package/dist/src/backend/metadata-backend-interface.d.ts +20 -0
- package/dist/src/backend/metadata-backend-interface.js +2 -0
- package/dist/src/backend/metadata-backend-interface.js.map +1 -0
- package/dist/src/metadata-service-error.d.ts +11 -0
- package/dist/src/metadata-service-error.js +18 -0
- package/dist/src/metadata-service-error.js.map +1 -0
- package/dist/src/metadata-service-interface.d.ts +44 -0
- package/dist/src/metadata-service-interface.js +2 -0
- package/dist/src/metadata-service-interface.js.map +1 -0
- package/dist/src/metadata-service.d.ts +18 -0
- package/dist/src/metadata-service.js +43 -0
- package/dist/src/metadata-service.js.map +1 -0
- package/dist/src/models/file.d.ts +29 -0
- package/dist/src/models/file.js +95 -0
- package/dist/src/models/file.js.map +1 -0
- package/dist/src/models/metadata-fields/field-types/boolean.d.ts +5 -0
- package/dist/src/models/metadata-fields/field-types/boolean.js +8 -0
- package/dist/src/models/metadata-fields/field-types/boolean.js.map +1 -0
- package/dist/src/models/metadata-fields/field-types/byte.d.ts +13 -0
- package/dist/src/models/metadata-fields/field-types/byte.js +16 -0
- package/dist/src/models/metadata-fields/field-types/byte.js.map +1 -0
- package/dist/src/models/metadata-fields/field-types/date.d.ts +5 -0
- package/dist/src/models/metadata-fields/field-types/date.js +8 -0
- package/dist/src/models/metadata-fields/field-types/date.js.map +1 -0
- package/dist/src/models/metadata-fields/field-types/duration.d.ts +14 -0
- package/dist/src/models/metadata-fields/field-types/duration.js +17 -0
- package/dist/src/models/metadata-fields/field-types/duration.js.map +1 -0
- package/dist/src/models/metadata-fields/field-types/list.d.ts +25 -0
- package/dist/src/models/metadata-fields/field-types/list.js +34 -0
- package/dist/src/models/metadata-fields/field-types/list.js.map +1 -0
- package/dist/src/models/metadata-fields/field-types/mediatype.d.ts +5 -0
- package/dist/src/models/metadata-fields/field-types/mediatype.js +8 -0
- package/dist/src/models/metadata-fields/field-types/mediatype.js.map +1 -0
- package/dist/src/models/metadata-fields/field-types/number.d.ts +5 -0
- package/dist/src/models/metadata-fields/field-types/number.js +8 -0
- package/dist/src/models/metadata-fields/field-types/number.js.map +1 -0
- package/dist/src/models/metadata-fields/field-types/page-progression.d.ts +5 -0
- package/dist/src/models/metadata-fields/field-types/page-progression.js +8 -0
- package/dist/src/models/metadata-fields/field-types/page-progression.js.map +1 -0
- package/dist/src/models/metadata-fields/field-types/string.d.ts +5 -0
- package/dist/src/models/metadata-fields/field-types/string.js +8 -0
- package/dist/src/models/metadata-fields/field-types/string.js.map +1 -0
- package/dist/src/models/metadata-fields/metadata-field.d.ts +70 -0
- package/dist/src/models/metadata-fields/metadata-field.js +67 -0
- package/dist/src/models/metadata-fields/metadata-field.js.map +1 -0
- package/dist/src/models/metadata.d.ts +168 -0
- package/dist/src/models/metadata.js +618 -0
- package/dist/src/models/metadata.js.map +1 -0
- package/dist/src/models/review.d.ts +10 -0
- package/dist/src/models/review.js +43 -0
- package/dist/src/models/review.js.map +1 -0
- package/dist/src/models/speech-music-asr-entry.d.ts +10 -0
- package/dist/src/models/speech-music-asr-entry.js +2 -0
- package/dist/src/models/speech-music-asr-entry.js.map +1 -0
- package/dist/src/responses/metadata-response.d.ts +28 -0
- package/dist/src/responses/metadata-response.js +31 -0
- package/dist/src/responses/metadata-response.js.map +1 -0
- package/dist/test/default-metadata-backend.test.d.ts +1 -0
- package/dist/test/default-metadata-backend.test.js +91 -0
- package/dist/test/default-metadata-backend.test.js.map +1 -0
- package/dist/test/metadata-service.test.d.ts +1 -0
- package/dist/test/metadata-service.test.js +99 -0
- package/dist/test/metadata-service.test.js.map +1 -0
- package/dist/test/mock-response-generator.d.ts +3 -0
- package/dist/test/mock-response-generator.js +62 -0
- package/dist/test/mock-response-generator.js.map +1 -0
- package/dist/test/models/file.test.d.ts +1 -0
- package/dist/test/models/file.test.js +9 -0
- package/dist/test/models/file.test.js.map +1 -0
- package/dist/test/models/metadata-fields/list-field.test.d.ts +1 -0
- package/dist/test/models/metadata-fields/list-field.test.js +52 -0
- package/dist/test/models/metadata-fields/list-field.test.js.map +1 -0
- package/dist/test/models/metadata-fields/metadata-field.test.d.ts +1 -0
- package/dist/test/models/metadata-fields/metadata-field.test.js +121 -0
- package/dist/test/models/metadata-fields/metadata-field.test.js.map +1 -0
- package/dist/test/models/metadata.test.d.ts +1 -0
- package/dist/test/models/metadata.test.js +10 -0
- package/dist/test/models/metadata.test.js.map +1 -0
- package/index.ts +32 -0
- package/package.json +77 -0
- package/src/backend/default-metadata-backend.ts +141 -0
- package/src/backend/metadata-backend-interface.ts +25 -0
- package/src/metadata-service-error.ts +21 -0
- package/src/metadata-service-interface.ts +51 -0
- package/src/metadata-service.ts +63 -0
- package/src/models/file.ts +105 -0
- package/src/models/metadata-fields/field-types/boolean.ts +8 -0
- package/src/models/metadata-fields/field-types/byte.ts +16 -0
- package/src/models/metadata-fields/field-types/date.ts +8 -0
- package/src/models/metadata-fields/field-types/duration.ts +17 -0
- package/src/models/metadata-fields/field-types/list.ts +44 -0
- package/src/models/metadata-fields/field-types/mediatype.ts +8 -0
- package/src/models/metadata-fields/field-types/number.ts +8 -0
- package/src/models/metadata-fields/field-types/page-progression.ts +14 -0
- package/src/models/metadata-fields/field-types/string.ts +8 -0
- package/src/models/metadata-fields/metadata-field.ts +108 -0
- package/src/models/metadata.ts +457 -0
- package/src/models/review.ts +41 -0
- package/src/models/speech-music-asr-entry.ts +10 -0
- package/src/responses/metadata-response.ts +61 -0
- package/test/default-metadata-backend.test.ts +101 -0
- package/test/metadata-service.test.ts +150 -0
- package/test/mock-response-generator.ts +62 -0
- package/test/models/file.test.ts +10 -0
- package/test/models/metadata-fields/list-field.test.ts +64 -0
- package/test/models/metadata-fields/metadata-field.test.ts +151 -0
- package/test/models/metadata.test.ts +11 -0
- package/tsconfig.json +22 -0
- package/web-test-runner.config.mjs +7 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
import { Memoize } from 'typescript-memoize';
|
|
4
|
+
import { DateParser, NumberParser } from '@internetarchive/field-parsers';
|
|
5
|
+
export class Review {
|
|
6
|
+
constructor(json) {
|
|
7
|
+
this.rawValue = json;
|
|
8
|
+
}
|
|
9
|
+
get reviewbody() {
|
|
10
|
+
return this.rawValue.reviewbody;
|
|
11
|
+
}
|
|
12
|
+
get reviewtitle() {
|
|
13
|
+
return this.rawValue.reviewtitle;
|
|
14
|
+
}
|
|
15
|
+
get reviewer() {
|
|
16
|
+
return this.rawValue.reviewer;
|
|
17
|
+
}
|
|
18
|
+
get reviewdate() {
|
|
19
|
+
return this.rawValue.reviewdate
|
|
20
|
+
? DateParser.shared.parseValue(this.rawValue.reviewdate)
|
|
21
|
+
: undefined;
|
|
22
|
+
}
|
|
23
|
+
get createdate() {
|
|
24
|
+
return this.rawValue.createdate
|
|
25
|
+
? DateParser.shared.parseValue(this.rawValue.createdate)
|
|
26
|
+
: undefined;
|
|
27
|
+
}
|
|
28
|
+
get stars() {
|
|
29
|
+
return this.rawValue.stars
|
|
30
|
+
? NumberParser.shared.parseValue(this.rawValue.stars)
|
|
31
|
+
: undefined;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
__decorate([
|
|
35
|
+
Memoize()
|
|
36
|
+
], Review.prototype, "reviewdate", null);
|
|
37
|
+
__decorate([
|
|
38
|
+
Memoize()
|
|
39
|
+
], Review.prototype, "createdate", null);
|
|
40
|
+
__decorate([
|
|
41
|
+
Memoize()
|
|
42
|
+
], Review.prototype, "stars", null);
|
|
43
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/models/review.ts"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE1E,MAAM,OAAO,MAAM;IAiCjB,YAAY,IAAyB;QACnC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAhCD,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;IAClC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;IACnC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEU,IAAI,UAAU;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU;YAC7B,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YACxD,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAEU,IAAI,UAAU;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU;YAC7B,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YACxD,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAEU,IAAI,KAAK;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK;YACxB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACrD,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;CAKF;AArBY;IAAV,OAAO,EAAE;wCAIT;AAEU;IAAV,OAAO,EAAE;wCAIT;AAEU;IAAV,OAAO,EAAE;mCAIT","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Memoize } from 'typescript-memoize';\nimport { DateParser, NumberParser } from '@internetarchive/field-parsers';\n\nexport class Review {\n rawValue: Record<string, any>;\n\n get reviewbody(): string | undefined {\n return this.rawValue.reviewbody;\n }\n\n get reviewtitle(): string | undefined {\n return this.rawValue.reviewtitle;\n }\n\n get reviewer(): string | undefined {\n return this.rawValue.reviewer;\n }\n\n @Memoize() get reviewdate(): Date | undefined {\n return this.rawValue.reviewdate\n ? DateParser.shared.parseValue(this.rawValue.reviewdate)\n : undefined;\n }\n\n @Memoize() get createdate(): Date | undefined {\n return this.rawValue.createdate\n ? DateParser.shared.parseValue(this.rawValue.createdate)\n : undefined;\n }\n\n @Memoize() get stars(): number | undefined {\n return this.rawValue.stars\n ? NumberParser.shared.parseValue(this.rawValue.stars)\n : undefined;\n }\n\n constructor(json: Record<string, any>) {\n this.rawValue = json;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speech-music-asr-entry.js","sourceRoot":"","sources":["../../../src/models/speech-music-asr-entry.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * This is the format used for radio transcripts\n */\nexport interface SpeechMusicASREntry {\n end: number;\n id: number;\n is_music: boolean;\n start: number;\n text: string;\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { File } from '../models/file';
|
|
2
|
+
import { Metadata } from '../models/metadata';
|
|
3
|
+
import { Review } from '../models/review';
|
|
4
|
+
import { SpeechMusicASREntry } from '../models/speech-music-asr-entry';
|
|
5
|
+
/**
|
|
6
|
+
* The main top-level reponse when fetching Metadata
|
|
7
|
+
*
|
|
8
|
+
* @export
|
|
9
|
+
* @class MetadataResponse
|
|
10
|
+
*/
|
|
11
|
+
export declare class MetadataResponse {
|
|
12
|
+
rawResponse: any;
|
|
13
|
+
created: number;
|
|
14
|
+
d1: string;
|
|
15
|
+
d2: string;
|
|
16
|
+
dir: string;
|
|
17
|
+
files: File[];
|
|
18
|
+
files_count: number;
|
|
19
|
+
item_last_updated: number;
|
|
20
|
+
item_size: number;
|
|
21
|
+
metadata: Metadata;
|
|
22
|
+
server: string;
|
|
23
|
+
uniq: number;
|
|
24
|
+
workable_servers: string[];
|
|
25
|
+
speech_vs_music_asr?: SpeechMusicASREntry[];
|
|
26
|
+
reviews?: Review[];
|
|
27
|
+
constructor(json: Record<string, any>);
|
|
28
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { File } from '../models/file';
|
|
3
|
+
import { Metadata } from '../models/metadata';
|
|
4
|
+
import { Review } from '../models/review';
|
|
5
|
+
/**
|
|
6
|
+
* The main top-level reponse when fetching Metadata
|
|
7
|
+
*
|
|
8
|
+
* @export
|
|
9
|
+
* @class MetadataResponse
|
|
10
|
+
*/
|
|
11
|
+
export class MetadataResponse {
|
|
12
|
+
constructor(json) {
|
|
13
|
+
var _a, _b;
|
|
14
|
+
this.rawResponse = json;
|
|
15
|
+
this.created = json.created;
|
|
16
|
+
this.d1 = json.d1;
|
|
17
|
+
this.d2 = json.d2;
|
|
18
|
+
this.dir = json.dir;
|
|
19
|
+
this.files = (_a = json.files) === null || _a === void 0 ? void 0 : _a.map((file) => new File(file));
|
|
20
|
+
this.files_count = json.files_count;
|
|
21
|
+
this.item_last_updated = json.item_last_updated;
|
|
22
|
+
this.item_size = json.item_size;
|
|
23
|
+
this.metadata = new Metadata(json.metadata);
|
|
24
|
+
this.server = json.server;
|
|
25
|
+
this.uniq = json.uniq;
|
|
26
|
+
this.workable_servers = json.workable_servers;
|
|
27
|
+
this.speech_vs_music_asr = json.speech_vs_music_asr;
|
|
28
|
+
this.reviews = (_b = json.reviews) === null || _b === void 0 ? void 0 : _b.map((entry) => new Review(entry));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=metadata-response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-response.js","sourceRoot":"","sources":["../../../src/responses/metadata-response.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1C;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IA+B3B,YAAY,IAAyB;;QACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,MAAA,IAAI,CAAC,KAAK,0CAAE,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC9C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,MAAA,IAAI,CAAC,OAAO,0CAAE,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;CACF","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { File } from '../models/file';\nimport { Metadata } from '../models/metadata';\nimport { Review } from '../models/review';\nimport { SpeechMusicASREntry } from '../models/speech-music-asr-entry';\n\n/**\n * The main top-level reponse when fetching Metadata\n *\n * @export\n * @class MetadataResponse\n */\nexport class MetadataResponse {\n rawResponse: any;\n\n created: number;\n\n d1: string;\n\n d2: string;\n\n dir: string;\n\n files: File[];\n\n files_count: number;\n\n item_last_updated: number;\n\n item_size: number;\n\n metadata: Metadata;\n\n server: string;\n\n uniq: number;\n\n workable_servers: string[];\n\n speech_vs_music_asr?: SpeechMusicASREntry[];\n\n reviews?: Review[];\n\n constructor(json: Record<string, any>) {\n this.rawResponse = json;\n this.created = json.created;\n this.d1 = json.d1;\n this.d2 = json.d2;\n this.dir = json.dir;\n this.files = json.files?.map((file: any) => new File(file));\n this.files_count = json.files_count;\n this.item_last_updated = json.item_last_updated;\n this.item_size = json.item_size;\n this.metadata = new Metadata(json.metadata);\n this.server = json.server;\n this.uniq = json.uniq;\n this.workable_servers = json.workable_servers;\n this.speech_vs_music_asr = json.speech_vs_music_asr;\n this.reviews = json.reviews?.map((entry: any) => new Review(entry));\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
import { expect } from '@open-wc/testing';
|
|
4
|
+
import { DefaultMetadataBackend } from '../src/backend/default-metadata-backend';
|
|
5
|
+
import { MetadataServiceErrorType } from '../src/metadata-service-error';
|
|
6
|
+
describe('DefaultMetadataBackend', () => {
|
|
7
|
+
it('can fetch metadata', async () => {
|
|
8
|
+
var _a;
|
|
9
|
+
const fetchBackup = window.fetch;
|
|
10
|
+
window.fetch = () => {
|
|
11
|
+
return new Promise(resolve => {
|
|
12
|
+
const response = new Response('{ "foo": "bar" }');
|
|
13
|
+
resolve(response);
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
const backend = new DefaultMetadataBackend();
|
|
17
|
+
const result = await backend.fetchMetadata('foo');
|
|
18
|
+
expect((_a = result.success) === null || _a === void 0 ? void 0 : _a.foo).to.equal('bar');
|
|
19
|
+
window.fetch = fetchBackup;
|
|
20
|
+
});
|
|
21
|
+
it('returns a networkError if theres a problem fetching using String type', async () => {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
const fetchBackup = window.fetch;
|
|
24
|
+
window.fetch = () => {
|
|
25
|
+
throw 'network error';
|
|
26
|
+
};
|
|
27
|
+
const backend = new DefaultMetadataBackend();
|
|
28
|
+
const result = await backend.fetchMetadata('foo');
|
|
29
|
+
expect((_a = result.error) === null || _a === void 0 ? void 0 : _a.type).to.equal(MetadataServiceErrorType.networkError);
|
|
30
|
+
expect((_b = result.error) === null || _b === void 0 ? void 0 : _b.message).to.equal('network error');
|
|
31
|
+
window.fetch = fetchBackup;
|
|
32
|
+
});
|
|
33
|
+
it('returns a networkError if theres a problem fetching using Error type', async () => {
|
|
34
|
+
var _a, _b;
|
|
35
|
+
const fetchBackup = window.fetch;
|
|
36
|
+
window.fetch = () => {
|
|
37
|
+
throw new Error('network error');
|
|
38
|
+
};
|
|
39
|
+
const backend = new DefaultMetadataBackend();
|
|
40
|
+
const result = await backend.fetchMetadata('foo');
|
|
41
|
+
expect((_a = result.error) === null || _a === void 0 ? void 0 : _a.type).to.equal(MetadataServiceErrorType.networkError);
|
|
42
|
+
expect((_b = result.error) === null || _b === void 0 ? void 0 : _b.message).to.equal('network error');
|
|
43
|
+
window.fetch = fetchBackup;
|
|
44
|
+
});
|
|
45
|
+
it('returns a decodingError if theres a problem decoding the json', async () => {
|
|
46
|
+
var _a;
|
|
47
|
+
const fetchBackup = window.fetch;
|
|
48
|
+
window.fetch = () => {
|
|
49
|
+
const response = new Response('boop');
|
|
50
|
+
return new Promise(resolve => resolve(response));
|
|
51
|
+
};
|
|
52
|
+
const backend = new DefaultMetadataBackend();
|
|
53
|
+
const result = await backend.fetchMetadata('foo');
|
|
54
|
+
expect((_a = result.error) === null || _a === void 0 ? void 0 : _a.type).to.equal(MetadataServiceErrorType.decodingError);
|
|
55
|
+
window.fetch = fetchBackup;
|
|
56
|
+
});
|
|
57
|
+
it('appends the scope if provided', async () => {
|
|
58
|
+
const fetchBackup = window.fetch;
|
|
59
|
+
let urlCalled = '';
|
|
60
|
+
window.fetch = (url) => {
|
|
61
|
+
urlCalled = url.toString();
|
|
62
|
+
const response = new Response('boop');
|
|
63
|
+
return new Promise(resolve => resolve(response));
|
|
64
|
+
};
|
|
65
|
+
const backend = new DefaultMetadataBackend({
|
|
66
|
+
scope: 'foo',
|
|
67
|
+
});
|
|
68
|
+
const result = await backend.fetchMetadata('foo');
|
|
69
|
+
expect(urlCalled.includes('scope=foo')).to.be.true;
|
|
70
|
+
window.fetch = fetchBackup;
|
|
71
|
+
});
|
|
72
|
+
it('does not credentials for metadata endpoint', async () => {
|
|
73
|
+
const fetchBackup = window.fetch;
|
|
74
|
+
let urlCalled;
|
|
75
|
+
let urlConfig;
|
|
76
|
+
window.fetch = (url, config) => {
|
|
77
|
+
urlCalled = url;
|
|
78
|
+
urlConfig = config;
|
|
79
|
+
const response = new Response('boop');
|
|
80
|
+
return new Promise(resolve => resolve(response));
|
|
81
|
+
};
|
|
82
|
+
const backend = new DefaultMetadataBackend({
|
|
83
|
+
scope: 'foo',
|
|
84
|
+
includeCredentials: true,
|
|
85
|
+
});
|
|
86
|
+
await backend.fetchMetadata('foo');
|
|
87
|
+
expect(urlConfig === null || urlConfig === void 0 ? void 0 : urlConfig.credentials).to.equal('omit');
|
|
88
|
+
window.fetch = fetchBackup;
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=default-metadata-backend.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-metadata-backend.test.js","sourceRoot":"","sources":["../../test/default-metadata-backend.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { expect } from '@open-wc/testing';\nimport { DefaultMetadataBackend } from '../src/backend/default-metadata-backend';\nimport { MetadataServiceErrorType } from '../src/metadata-service-error';\n\ndescribe('DefaultMetadataBackend', () => {\n it('can fetch metadata', async () => {\n const fetchBackup = window.fetch;\n window.fetch = (): Promise<Response> => {\n return new Promise(resolve => {\n const response = new Response('{ \"foo\": \"bar\" }');\n resolve(response);\n });\n };\n\n const backend = new DefaultMetadataBackend();\n const result = await backend.fetchMetadata('foo');\n expect(result.success?.foo).to.equal('bar');\n window.fetch = fetchBackup;\n });\n\n it('returns a networkError if theres a problem fetching using String type', async () => {\n const fetchBackup = window.fetch;\n window.fetch = (): Promise<Response> => {\n throw 'network error';\n };\n\n const backend = new DefaultMetadataBackend();\n const result = await backend.fetchMetadata('foo');\n expect(result.error?.type).to.equal(MetadataServiceErrorType.networkError);\n expect(result.error?.message).to.equal('network error');\n window.fetch = fetchBackup;\n });\n\n it('returns a networkError if theres a problem fetching using Error type', async () => {\n const fetchBackup = window.fetch;\n window.fetch = (): Promise<Response> => {\n throw new Error('network error');\n };\n\n const backend = new DefaultMetadataBackend();\n const result = await backend.fetchMetadata('foo');\n expect(result.error?.type).to.equal(MetadataServiceErrorType.networkError);\n expect(result.error?.message).to.equal('network error');\n window.fetch = fetchBackup;\n });\n\n it('returns a decodingError if theres a problem decoding the json', async () => {\n const fetchBackup = window.fetch;\n window.fetch = (): Promise<Response> => {\n const response = new Response('boop');\n return new Promise(resolve => resolve(response));\n };\n\n const backend = new DefaultMetadataBackend();\n const result = await backend.fetchMetadata('foo');\n expect(result.error?.type).to.equal(MetadataServiceErrorType.decodingError);\n window.fetch = fetchBackup;\n });\n\n it('appends the scope if provided', async () => {\n const fetchBackup = window.fetch;\n let urlCalled = '';\n window.fetch = (url: RequestInfo): Promise<Response> => {\n urlCalled = url.toString();\n const response = new Response('boop');\n return new Promise(resolve => resolve(response));\n };\n\n const backend = new DefaultMetadataBackend({\n scope: 'foo',\n });\n const result = await backend.fetchMetadata('foo');\n expect(urlCalled.includes('scope=foo')).to.be.true;\n window.fetch = fetchBackup;\n });\n\n it('does not credentials for metadata endpoint', async () => {\n const fetchBackup = window.fetch;\n let urlCalled: RequestInfo;\n let urlConfig: RequestInit | undefined;\n window.fetch = (\n url: RequestInfo,\n config?: RequestInit\n ): Promise<Response> => {\n urlCalled = url;\n urlConfig = config;\n const response = new Response('boop');\n return new Promise(resolve => resolve(response));\n };\n\n const backend = new DefaultMetadataBackend({\n scope: 'foo',\n includeCredentials: true,\n });\n await backend.fetchMetadata('foo');\n expect(urlConfig?.credentials).to.equal('omit');\n window.fetch = fetchBackup;\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
import { expect } from '@open-wc/testing';
|
|
4
|
+
import { MockResponseGenerator } from './mock-response-generator';
|
|
5
|
+
import { MetadataServiceError, MetadataServiceErrorType, } from '../src/metadata-service-error';
|
|
6
|
+
import { MetadataService } from '../src/metadata-service';
|
|
7
|
+
describe('MetadataService', () => {
|
|
8
|
+
it('can request metadata when requested', async () => {
|
|
9
|
+
var _a;
|
|
10
|
+
class MockMetadataBackend {
|
|
11
|
+
async fetchMetadata(identifier) {
|
|
12
|
+
const responseGenerator = new MockResponseGenerator();
|
|
13
|
+
const mockResponse = responseGenerator.generateMockMetadataResponse(identifier);
|
|
14
|
+
return { success: mockResponse };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const backend = new MockMetadataBackend();
|
|
18
|
+
const service = new MetadataService(backend);
|
|
19
|
+
const result = await service.fetchMetadata('foo');
|
|
20
|
+
expect((_a = result.success) === null || _a === void 0 ? void 0 : _a.metadata.identifier).to.equal('foo');
|
|
21
|
+
});
|
|
22
|
+
describe('requestMetadataValue', async () => {
|
|
23
|
+
class MockMetadataBackend {
|
|
24
|
+
async fetchMetadata(identifier, keypath) {
|
|
25
|
+
return {
|
|
26
|
+
success: {
|
|
27
|
+
result: this.response,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
it('can request a metadata value', async () => {
|
|
33
|
+
const backend = new MockMetadataBackend();
|
|
34
|
+
const service = new MetadataService(backend);
|
|
35
|
+
let expectedResult = 'foo';
|
|
36
|
+
backend.response = expectedResult;
|
|
37
|
+
let result = await service.fetchMetadataValue('foo', 'metadata');
|
|
38
|
+
expect(result.success).to.equal(expectedResult);
|
|
39
|
+
expectedResult = { foo: 'bar' };
|
|
40
|
+
backend.response = expectedResult;
|
|
41
|
+
result = await service.fetchMetadataValue('foo', 'metadata');
|
|
42
|
+
expect(result.success).to.equal(expectedResult);
|
|
43
|
+
expect(result.success.foo).to.equal('bar');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
it('returns an error result if the item is not found', async () => {
|
|
47
|
+
var _a, _b;
|
|
48
|
+
class MockSearchBackend {
|
|
49
|
+
async fetchMetadata(identifier) {
|
|
50
|
+
// this is unfortunate.. instead of getting an http 404 error,
|
|
51
|
+
// we get an empty JSON object when an item is not found
|
|
52
|
+
return { success: {} };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const backend = new MockSearchBackend();
|
|
56
|
+
const service = new MetadataService(backend);
|
|
57
|
+
const result = await service.fetchMetadata('foo');
|
|
58
|
+
expect(result.error).to.not.equal(undefined);
|
|
59
|
+
expect((_a = result.error) === null || _a === void 0 ? void 0 : _a.type).to.equal(MetadataServiceErrorType.itemNotFound);
|
|
60
|
+
const valueResult = await service.fetchMetadataValue('foo', 'metadata');
|
|
61
|
+
expect(valueResult.error).to.not.equal(undefined);
|
|
62
|
+
expect((_b = valueResult.error) === null || _b === void 0 ? void 0 : _b.type).to.equal(MetadataServiceErrorType.itemNotFound);
|
|
63
|
+
});
|
|
64
|
+
it('returns the network error if one occurs', async () => {
|
|
65
|
+
var _a, _b, _c, _d;
|
|
66
|
+
class MockSearchBackend {
|
|
67
|
+
async fetchMetadata(identifier) {
|
|
68
|
+
const error = new MetadataServiceError(MetadataServiceErrorType.networkError, 'network error');
|
|
69
|
+
return { error };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const backend = new MockSearchBackend();
|
|
73
|
+
const service = new MetadataService(backend);
|
|
74
|
+
const metadataResult = await service.fetchMetadata('foo');
|
|
75
|
+
expect(metadataResult.error).to.not.equal(undefined);
|
|
76
|
+
expect((_a = metadataResult.error) === null || _a === void 0 ? void 0 : _a.type).to.equal(MetadataServiceErrorType.networkError);
|
|
77
|
+
expect((_b = metadataResult.error) === null || _b === void 0 ? void 0 : _b.message).to.equal('network error');
|
|
78
|
+
const metadataValueResult = await service.fetchMetadataValue('foo', 'bar');
|
|
79
|
+
expect(metadataValueResult.error).to.not.equal(undefined);
|
|
80
|
+
expect((_c = metadataValueResult.error) === null || _c === void 0 ? void 0 : _c.type).to.equal(MetadataServiceErrorType.networkError);
|
|
81
|
+
expect((_d = metadataValueResult.error) === null || _d === void 0 ? void 0 : _d.message).to.equal('network error');
|
|
82
|
+
});
|
|
83
|
+
it('returns a decoding error if one occurs', async () => {
|
|
84
|
+
var _a, _b;
|
|
85
|
+
class MockSearchBackend {
|
|
86
|
+
async fetchMetadata(identifier) {
|
|
87
|
+
const error = new MetadataServiceError(MetadataServiceErrorType.decodingError, 'decoding error');
|
|
88
|
+
return { error };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const backend = new MockSearchBackend();
|
|
92
|
+
const service = new MetadataService(backend);
|
|
93
|
+
const metadataResult = await service.fetchMetadata('foo');
|
|
94
|
+
expect(metadataResult.error).to.not.equal(undefined);
|
|
95
|
+
expect((_a = metadataResult.error) === null || _a === void 0 ? void 0 : _a.type).to.equal(MetadataServiceErrorType.decodingError);
|
|
96
|
+
expect((_b = metadataResult.error) === null || _b === void 0 ? void 0 : _b.message).to.equal('decoding error');
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=metadata-service.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-service.test.js","sourceRoot":"","sources":["../../test/metadata-service.test.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,uDAAuD;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAIlE,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;;QACnD,MAAM,mBAAmB;YACvB,KAAK,CAAC,aAAa,CACjB,UAAkB;gBAElB,MAAM,iBAAiB,GAAG,IAAI,qBAAqB,EAAE,CAAC;gBACtD,MAAM,YAAY,GAChB,iBAAiB,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC;gBAC7D,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;YACnC,CAAC;SACF;QAED,MAAM,OAAO,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,MAAA,MAAM,CAAC,OAAO,0CAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,mBAAmB;YAEvB,KAAK,CAAC,aAAa,CACjB,UAAkB,EAClB,OAAgB;gBAEhB,OAAO;oBACL,OAAO,EAAE;wBACP,MAAM,EAAE,IAAI,CAAC,QAAQ;qBACtB;iBACF,CAAC;YACJ,CAAC;SACF;QAED,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,OAAO,GAAG,IAAI,mBAAmB,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;YAE7C,IAAI,cAAc,GAAQ,KAAK,CAAC;YAChC,OAAO,CAAC,QAAQ,GAAG,cAAc,CAAC;YAElC,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAC3C,KAAK,EACL,UAAU,CACX,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAEhD,cAAc,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;YAChC,OAAO,CAAC,QAAQ,GAAG,cAAc,CAAC;YAElC,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,CACvC,KAAK,EACL,UAAU,CACX,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;;QAChE,MAAM,iBAAiB;YACrB,KAAK,CAAC,aAAa,CACjB,UAAkB;gBAElB,8DAA8D;gBAC9D,wDAAwD;gBACxD,OAAO,EAAE,OAAO,EAAE,EAAS,EAAE,CAAC;YAChC,CAAC;SACF;QAED,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAA,MAAM,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;QAE3E,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACxE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,MAAA,WAAW,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CACtC,wBAAwB,CAAC,YAAY,CACtC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;;QACvD,MAAM,iBAAiB;YACrB,KAAK,CAAC,aAAa,CACjB,UAAkB;gBAElB,MAAM,KAAK,GAAG,IAAI,oBAAoB,CACpC,wBAAwB,CAAC,YAAY,EACrC,eAAe,CAChB,CAAC;gBACF,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,CAAC;SACF;QAED,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,CAAC,MAAA,cAAc,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CACzC,wBAAwB,CAAC,YAAY,CACtC,CAAC;QACF,MAAM,CAAC,MAAA,cAAc,CAAC,KAAK,0CAAE,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAEhE,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3E,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAA,mBAAmB,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAC9C,wBAAwB,CAAC,YAAY,CACtC,CAAC;QACF,MAAM,CAAC,MAAA,mBAAmB,CAAC,KAAK,0CAAE,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;;QACtD,MAAM,iBAAiB;YACrB,KAAK,CAAC,aAAa,CACjB,UAAkB;gBAElB,MAAM,KAAK,GAAG,IAAI,oBAAoB,CACpC,wBAAwB,CAAC,aAAa,EACtC,gBAAgB,CACjB,CAAC;gBACF,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,CAAC;SACF;QAED,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,CAAC,MAAA,cAAc,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CACzC,wBAAwB,CAAC,aAAa,CACvC,CAAC;QACF,MAAM,CAAC,MAAA,cAAc,CAAC,KAAK,0CAAE,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { expect } from '@open-wc/testing';\n\nimport { MockResponseGenerator } from './mock-response-generator';\nimport { MetadataResponse } from '../src/responses/metadata-response';\nimport { Result } from '@internetarchive/result-type';\nimport { MetadataBackendInterface } from '../src/backend/metadata-backend-interface';\nimport {\n MetadataServiceError,\n MetadataServiceErrorType,\n} from '../src/metadata-service-error';\nimport { MetadataService } from '../src/metadata-service';\n\ndescribe('MetadataService', () => {\n it('can request metadata when requested', async () => {\n class MockMetadataBackend implements MetadataBackendInterface {\n async fetchMetadata(\n identifier: string\n ): Promise<Result<MetadataResponse, MetadataServiceError>> {\n const responseGenerator = new MockResponseGenerator();\n const mockResponse =\n responseGenerator.generateMockMetadataResponse(identifier);\n return { success: mockResponse };\n }\n }\n\n const backend = new MockMetadataBackend();\n const service = new MetadataService(backend);\n const result = await service.fetchMetadata('foo');\n expect(result.success?.metadata.identifier).to.equal('foo');\n });\n\n describe('requestMetadataValue', async () => {\n class MockMetadataBackend implements MetadataBackendInterface {\n response: any;\n async fetchMetadata(\n identifier: string,\n keypath?: string\n ): Promise<Result<any, MetadataServiceError>> {\n return {\n success: {\n result: this.response,\n },\n };\n }\n }\n\n it('can request a metadata value', async () => {\n const backend = new MockMetadataBackend();\n const service = new MetadataService(backend);\n\n let expectedResult: any = 'foo';\n backend.response = expectedResult;\n\n let result = await service.fetchMetadataValue<typeof expectedResult>(\n 'foo',\n 'metadata'\n );\n expect(result.success).to.equal(expectedResult);\n\n expectedResult = { foo: 'bar' };\n backend.response = expectedResult;\n\n result = await service.fetchMetadataValue<typeof expectedResult>(\n 'foo',\n 'metadata'\n );\n expect(result.success).to.equal(expectedResult);\n expect(result.success.foo).to.equal('bar');\n });\n });\n\n it('returns an error result if the item is not found', async () => {\n class MockSearchBackend implements MetadataBackendInterface {\n async fetchMetadata(\n identifier: string\n ): Promise<Result<MetadataResponse, MetadataServiceError>> {\n // this is unfortunate.. instead of getting an http 404 error,\n // we get an empty JSON object when an item is not found\n return { success: {} as any };\n }\n }\n\n const backend = new MockSearchBackend();\n const service = new MetadataService(backend);\n const result = await service.fetchMetadata('foo');\n expect(result.error).to.not.equal(undefined);\n expect(result.error?.type).to.equal(MetadataServiceErrorType.itemNotFound);\n\n const valueResult = await service.fetchMetadataValue('foo', 'metadata');\n expect(valueResult.error).to.not.equal(undefined);\n expect(valueResult.error?.type).to.equal(\n MetadataServiceErrorType.itemNotFound\n );\n });\n\n it('returns the network error if one occurs', async () => {\n class MockSearchBackend implements MetadataBackendInterface {\n async fetchMetadata(\n identifier: string\n ): Promise<Result<MetadataResponse, MetadataServiceError>> {\n const error = new MetadataServiceError(\n MetadataServiceErrorType.networkError,\n 'network error'\n );\n return { error };\n }\n }\n\n const backend = new MockSearchBackend();\n const service = new MetadataService(backend);\n const metadataResult = await service.fetchMetadata('foo');\n expect(metadataResult.error).to.not.equal(undefined);\n expect(metadataResult.error?.type).to.equal(\n MetadataServiceErrorType.networkError\n );\n expect(metadataResult.error?.message).to.equal('network error');\n\n const metadataValueResult = await service.fetchMetadataValue('foo', 'bar');\n expect(metadataValueResult.error).to.not.equal(undefined);\n expect(metadataValueResult.error?.type).to.equal(\n MetadataServiceErrorType.networkError\n );\n expect(metadataValueResult.error?.message).to.equal('network error');\n });\n\n it('returns a decoding error if one occurs', async () => {\n class MockSearchBackend implements MetadataBackendInterface {\n async fetchMetadata(\n identifier: string\n ): Promise<Result<MetadataResponse, MetadataServiceError>> {\n const error = new MetadataServiceError(\n MetadataServiceErrorType.decodingError,\n 'decoding error'\n );\n return { error };\n }\n }\n\n const backend = new MockSearchBackend();\n const service = new MetadataService(backend);\n const metadataResult = await service.fetchMetadata('foo');\n expect(metadataResult.error).to.not.equal(undefined);\n expect(metadataResult.error?.type).to.equal(\n MetadataServiceErrorType.decodingError\n );\n expect(metadataResult.error?.message).to.equal('decoding error');\n });\n});\n"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
export class MockResponseGenerator {
|
|
3
|
+
generateMockMetadataResponse(identifier) {
|
|
4
|
+
return {
|
|
5
|
+
created: 1586477049,
|
|
6
|
+
d1: 'ia600201.us.archive.org',
|
|
7
|
+
d2: 'ia800201.us.archive.org',
|
|
8
|
+
dir: '/27/items/rss-383924main_TWAN_09_04_09',
|
|
9
|
+
files: [
|
|
10
|
+
{
|
|
11
|
+
name: 'foo.jpg',
|
|
12
|
+
source: 'derivative',
|
|
13
|
+
format: 'Thumbnail',
|
|
14
|
+
original: 'foo.mp4',
|
|
15
|
+
md5: '48067b43a547d3e90cb433a04ba84d5d',
|
|
16
|
+
mtime: '1256675427',
|
|
17
|
+
size: '1135',
|
|
18
|
+
crc32: '40870038',
|
|
19
|
+
sha1: '6445c2a6f51c8314c1872ec1f7daf33c5cfabd06',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'bar.jpg',
|
|
23
|
+
source: 'derivative',
|
|
24
|
+
format: 'Thumbnail',
|
|
25
|
+
original: 'bar.mp4',
|
|
26
|
+
md5: '5bf69912d7b796fe309cde32e61230bc',
|
|
27
|
+
mtime: '1256675429',
|
|
28
|
+
size: '6329',
|
|
29
|
+
crc32: 'ba5f361a',
|
|
30
|
+
sha1: 'cddab0e2daab29978e5efdeff735240a44aa7c80',
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
files_count: 2,
|
|
34
|
+
item_last_updated: 1463797130,
|
|
35
|
+
item_size: 99872691,
|
|
36
|
+
metadata: {
|
|
37
|
+
feed_id: '/0/rss_feeds/NASACast_Video/nasacast_video:sts128_landing/NASAcast_vodcast.rss',
|
|
38
|
+
mediatype: 'movies',
|
|
39
|
+
title: "NASA TV's This Week @NASA, September 4",
|
|
40
|
+
description: "NASA TV's This Week @NASA, September 4",
|
|
41
|
+
creator: 'NASA',
|
|
42
|
+
source: 'http://www.nasa.gov/multimedia/podcasting/twan_09_04_09.html',
|
|
43
|
+
date: '9/4/2009',
|
|
44
|
+
year: '2009',
|
|
45
|
+
rights: 'Public Domain',
|
|
46
|
+
language: 'en-us',
|
|
47
|
+
updater: 'BonnieReal',
|
|
48
|
+
updatedate: '2009-10-27 20:23:01',
|
|
49
|
+
identifier,
|
|
50
|
+
uploader: 'bonnie@archive.org',
|
|
51
|
+
addeddate: '2009-10-27 20:25:55',
|
|
52
|
+
publicdate: '2009-10-27 20:41:27',
|
|
53
|
+
collection: ['nasa', 'nasacastvideo'],
|
|
54
|
+
backup_location: 'ia903604_7',
|
|
55
|
+
},
|
|
56
|
+
server: 'ia800201.us.archive.org',
|
|
57
|
+
uniq: 162444403,
|
|
58
|
+
workable_servers: ['ia800201.us.archive.org', 'ia600201.us.archive.org'],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=mock-response-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-response-generator.js","sourceRoot":"","sources":["../../test/mock-response-generator.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,OAAO,qBAAqB;IAChC,4BAA4B,CAAC,UAAkB;QAC7C,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,EAAE,EAAE,yBAAyB;YAC7B,EAAE,EAAE,yBAAyB;YAC7B,GAAG,EAAE,wCAAwC;YAC7C,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE,WAAW;oBACnB,QAAQ,EAAE,SAAS;oBACnB,GAAG,EAAE,kCAAkC;oBACvC,KAAK,EAAE,YAAY;oBACnB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,UAAU;oBACjB,IAAI,EAAE,0CAA0C;iBACjD;gBACD;oBACE,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE,WAAW;oBACnB,QAAQ,EAAE,SAAS;oBACnB,GAAG,EAAE,kCAAkC;oBACvC,KAAK,EAAE,YAAY;oBACnB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,UAAU;oBACjB,IAAI,EAAE,0CAA0C;iBACjD;aACF;YACD,WAAW,EAAE,CAAC;YACd,iBAAiB,EAAE,UAAU;YAC7B,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE;gBACR,OAAO,EACL,gFAAgF;gBAClF,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,wCAAwC;gBAC/C,WAAW,EAAE,wCAAwC;gBACrD,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE,8DAA8D;gBACtE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,eAAe;gBACvB,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,YAAY;gBACrB,UAAU,EAAE,qBAAqB;gBACjC,UAAU;gBACV,QAAQ,EAAE,oBAAoB;gBAC9B,SAAS,EAAE,qBAAqB;gBAChC,UAAU,EAAE,qBAAqB;gBACjC,UAAU,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;gBACrC,eAAe,EAAE,YAAY;aAC9B;YACD,MAAM,EAAE,yBAAyB;YACjC,IAAI,EAAE,SAAS;YACf,gBAAgB,EAAE,CAAC,yBAAyB,EAAE,yBAAyB,CAAC;SACzE,CAAC;IACJ,CAAC;CACF","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nexport class MockResponseGenerator {\n generateMockMetadataResponse(identifier: string): any {\n return {\n created: 1586477049,\n d1: 'ia600201.us.archive.org',\n d2: 'ia800201.us.archive.org',\n dir: '/27/items/rss-383924main_TWAN_09_04_09',\n files: [\n {\n name: 'foo.jpg',\n source: 'derivative',\n format: 'Thumbnail',\n original: 'foo.mp4',\n md5: '48067b43a547d3e90cb433a04ba84d5d',\n mtime: '1256675427',\n size: '1135',\n crc32: '40870038',\n sha1: '6445c2a6f51c8314c1872ec1f7daf33c5cfabd06',\n },\n {\n name: 'bar.jpg',\n source: 'derivative',\n format: 'Thumbnail',\n original: 'bar.mp4',\n md5: '5bf69912d7b796fe309cde32e61230bc',\n mtime: '1256675429',\n size: '6329',\n crc32: 'ba5f361a',\n sha1: 'cddab0e2daab29978e5efdeff735240a44aa7c80',\n },\n ],\n files_count: 2,\n item_last_updated: 1463797130,\n item_size: 99872691,\n metadata: {\n feed_id:\n '/0/rss_feeds/NASACast_Video/nasacast_video:sts128_landing/NASAcast_vodcast.rss',\n mediatype: 'movies',\n title: \"NASA TV's This Week @NASA, September 4\",\n description: \"NASA TV's This Week @NASA, September 4\",\n creator: 'NASA',\n source: 'http://www.nasa.gov/multimedia/podcasting/twan_09_04_09.html',\n date: '9/4/2009',\n year: '2009',\n rights: 'Public Domain',\n language: 'en-us',\n updater: 'BonnieReal',\n updatedate: '2009-10-27 20:23:01',\n identifier,\n uploader: 'bonnie@archive.org',\n addeddate: '2009-10-27 20:25:55',\n publicdate: '2009-10-27 20:41:27',\n collection: ['nasa', 'nasacastvideo'],\n backup_location: 'ia903604_7',\n },\n server: 'ia800201.us.archive.org',\n uniq: 162444403,\n workable_servers: ['ia800201.us.archive.org', 'ia600201.us.archive.org'],\n };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { expect } from '@open-wc/testing';
|
|
2
|
+
import { File } from '../../src/models/file';
|
|
3
|
+
describe('File', () => {
|
|
4
|
+
it('can be instantiated with an object', async () => {
|
|
5
|
+
const file = new File({ name: 'foo.jpg' });
|
|
6
|
+
expect(file.name).to.equal('foo.jpg');
|
|
7
|
+
});
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=file.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.test.js","sourceRoot":"","sources":["../../../test/models/file.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAE7C,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { expect } from '@open-wc/testing';\n\nimport { File } from '../../src/models/file';\n\ndescribe('File', () => {\n it('can be instantiated with an object', async () => {\n const file = new File({ name: 'foo.jpg' });\n expect(file.name).to.equal('foo.jpg');\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { expect } from '@open-wc/testing';
|
|
2
|
+
import { NumberListField, StringListField, } from '../../../src/models/metadata-fields/field-types/list';
|
|
3
|
+
describe('List Field', () => {
|
|
4
|
+
describe('String List Field', () => {
|
|
5
|
+
it('can parse individual values', () => {
|
|
6
|
+
const stringListField = new StringListField('foo');
|
|
7
|
+
expect(stringListField.value).to.equal('foo');
|
|
8
|
+
expect(stringListField.values).to.deep.equal(['foo']);
|
|
9
|
+
expect(stringListField.rawValue).to.equal('foo');
|
|
10
|
+
});
|
|
11
|
+
it('can parse lists', () => {
|
|
12
|
+
const stringListField = new StringListField('foo, bar, baz');
|
|
13
|
+
expect(stringListField.value).to.equal('foo');
|
|
14
|
+
expect(stringListField.values).to.deep.equal(['foo', 'bar', 'baz']);
|
|
15
|
+
expect(stringListField.rawValue).to.equal('foo, bar, baz');
|
|
16
|
+
});
|
|
17
|
+
it('can parse lists of lists', () => {
|
|
18
|
+
const stringListField = new StringListField([
|
|
19
|
+
'foo, bar, baz',
|
|
20
|
+
'beep, boop, bop',
|
|
21
|
+
]);
|
|
22
|
+
expect(stringListField.value).to.equal('foo');
|
|
23
|
+
expect(stringListField.values).to.deep.equal([
|
|
24
|
+
'foo',
|
|
25
|
+
'bar',
|
|
26
|
+
'baz',
|
|
27
|
+
'beep',
|
|
28
|
+
'boop',
|
|
29
|
+
'bop',
|
|
30
|
+
]);
|
|
31
|
+
expect(stringListField.rawValue).to.deep.equal([
|
|
32
|
+
'foo, bar, baz',
|
|
33
|
+
'beep, boop, bop',
|
|
34
|
+
]);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('NumberListField', () => {
|
|
38
|
+
it('can parse lists of numbers', () => {
|
|
39
|
+
const listField = new NumberListField('1, 2, 3');
|
|
40
|
+
expect(listField.value).to.equal(1);
|
|
41
|
+
expect(listField.values).to.deep.equal([1, 2, 3]);
|
|
42
|
+
expect(listField.rawValue).to.equal('1, 2, 3');
|
|
43
|
+
});
|
|
44
|
+
it('can parse lists of lists', () => {
|
|
45
|
+
const listField = new NumberListField(['1, 2, 3', '4, 5, 6']);
|
|
46
|
+
expect(listField.value).to.equal(1);
|
|
47
|
+
expect(listField.values).to.deep.equal([1, 2, 3, 4, 5, 6]);
|
|
48
|
+
expect(listField.rawValue).to.deep.equal(['1, 2, 3', '4, 5, 6']);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=list-field.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-field.test.js","sourceRoot":"","sources":["../../../../test/models/metadata-fields/list-field.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport {\n NumberListField,\n StringListField,\n} from '../../../src/models/metadata-fields/field-types/list';\n\ndescribe('List Field', () => {\n describe('String List Field', () => {\n it('can parse individual values', () => {\n const stringListField = new StringListField('foo');\n\n expect(stringListField.value).to.equal('foo');\n expect(stringListField.values).to.deep.equal(['foo']);\n expect(stringListField.rawValue).to.equal('foo');\n });\n\n it('can parse lists', () => {\n const stringListField = new StringListField('foo, bar, baz');\n\n expect(stringListField.value).to.equal('foo');\n expect(stringListField.values).to.deep.equal(['foo', 'bar', 'baz']);\n expect(stringListField.rawValue).to.equal('foo, bar, baz');\n });\n\n it('can parse lists of lists', () => {\n const stringListField = new StringListField([\n 'foo, bar, baz',\n 'beep, boop, bop',\n ]);\n\n expect(stringListField.value).to.equal('foo');\n expect(stringListField.values).to.deep.equal([\n 'foo',\n 'bar',\n 'baz',\n 'beep',\n 'boop',\n 'bop',\n ]);\n expect(stringListField.rawValue).to.deep.equal([\n 'foo, bar, baz',\n 'beep, boop, bop',\n ]);\n });\n });\n\n describe('NumberListField', () => {\n it('can parse lists of numbers', () => {\n const listField = new NumberListField('1, 2, 3');\n\n expect(listField.value).to.equal(1);\n expect(listField.values).to.deep.equal([1, 2, 3]);\n expect(listField.rawValue).to.equal('1, 2, 3');\n });\n\n it('can parse lists of lists', () => {\n const listField = new NumberListField(['1, 2, 3', '4, 5, 6']);\n\n expect(listField.value).to.equal(1);\n expect(listField.values).to.deep.equal([1, 2, 3, 4, 5, 6]);\n expect(listField.rawValue).to.deep.equal(['1, 2, 3', '4, 5, 6']);\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|