Clean-up after merge

This commit is contained in:
mProjectsCode 2022-09-22 13:55:16 +02:00
parent 391915eb09
commit da16b2af6a
15 changed files with 177 additions and 171 deletions

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "obsidian-media-db-plugin",
"version": "0.3.0",
"version": "0.3.1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "obsidian-media-db-plugin",
"version": "0.3.0",
"version": "0.3.1",
"license": "GPL-3.0",
"dependencies": {
"ts-node": "^10.8.1",

View file

@ -1,6 +1,6 @@
{
"name": "obsidian-media-db-plugin",
"version": "0.3.1",
"version": "0.3.2",
"description": "A plugin that can query multiple APIs for movies, series, anime, games, music and wiki articles, and import them into your vault.",
"main": "main.js",
"scripts": {

View file

@ -32,16 +32,16 @@ export class BoardGameGeekAPI extends APIModel {
}
const data = fetchData.text;
const response = new window.DOMParser().parseFromString(data, "text/xml")
const response = new window.DOMParser().parseFromString(data, 'text/xml');
debugLog(response);
let ret: MediaTypeModel[] = [];
for (const boardgame of Array.from(response.querySelectorAll("boardgame"))) {
const id = boardgame.attributes.getNamedItem("objectid")!.value;
const title = boardgame.querySelector("name")!.textContent!;
const year = boardgame.querySelector("yearpublished")?.textContent ?? "";
for (const boardgame of Array.from(response.querySelectorAll('boardgame'))) {
const id = boardgame.attributes.getNamedItem('objectid')!.value;
const title = boardgame.querySelector('name')!.textContent!;
const year = boardgame.querySelector('yearpublished')?.textContent ?? '';
ret.push(new BoardGameModel({
dataSource: this.apiName,
@ -68,21 +68,21 @@ export class BoardGameGeekAPI extends APIModel {
}
const data = fetchData.text;
const response = new window.DOMParser().parseFromString(data, "text/xml")
const response = new window.DOMParser().parseFromString(data, 'text/xml');
debugLog(response);
const boardgame = response.querySelector("boardgame")!;
const title = boardgame.querySelector("name")!.textContent!;
const year = boardgame.querySelector("yearpublished")?.textContent ?? "";
const image = boardgame.querySelector("image")?.textContent ?? undefined;
const onlineRating = Number.parseFloat(boardgame.querySelector("statistics ratings average")?.textContent ?? "");
const genres = Array.from(boardgame.querySelectorAll("boardgamecategory")).map(n => n!.textContent!);
const boardgame = response.querySelector('boardgame')!;
const title = boardgame.querySelector('name')!.textContent!;
const year = boardgame.querySelector('yearpublished')?.textContent ?? '';
const image = boardgame.querySelector('image')?.textContent ?? undefined;
const onlineRating = Number.parseFloat(boardgame.querySelector('statistics ratings average')?.textContent ?? '');
const genres = Array.from(boardgame.querySelectorAll('boardgamecategory')).map(n => n!.textContent!);
const model = new BoardGameModel({
type: MediaType.BoardGame,
title,
englishTitle: title,
year: year === "0" ? "" : year,
year: year === '0' ? '' : year,
dataSource: this.apiName,
url: `https://boardgamegeek.com/boardgame/${id}`,
id,

View file

@ -402,7 +402,7 @@ export default class MediaDbPlugin extends Plugin {
if (err) {
return reject(err);
}
resolve(res)
resolve(res);
}).open();
});
}
@ -413,7 +413,7 @@ export default class MediaDbPlugin extends Plugin {
if (err) {
return reject(err);
}
resolve(res)
resolve(res);
}).open();
});
}
@ -426,7 +426,7 @@ export default class MediaDbPlugin extends Plugin {
}
resolve(res);
}, () => {
resolve([])
resolve([]);
}).open();
});
}

View file

@ -40,7 +40,7 @@ export class MusicReleaseModel extends MediaTypeModel {
getSummary(): string {
var summary = this.title + ' (' + this.year + ')';
if (this.artists.length > 0)
summary += ' - ' + this.artists.join(', ')
summary += ' - ' + this.artists.join(', ');
return summary;
}
}

View file

@ -7,12 +7,12 @@ import { OMDbAPI } from '../api/apis/OMDbAPI';
import {SteamAPI} from '../api/apis/SteamAPI';
import {WikipediaAPI} from '../api/apis/WikipediaAPI';
import MediaDbPlugin from '../main';
import { setMALResponseMock, setMusicBrainzResponseMock, setOMDbResponseMock, setSteamResponseMock, setWikipediaResponseMock } from "./mockHelpers";
import MALMockMovie from "./ResponseMocks/MALMockMovie.json";
import MusicBrainzResponseMock from "./ResponseMocks/MusicBrainzMockResponse.json";
import OMDBMockMovie from "./ResponseMocks/OMDBMockResponse.json";
import SteamAPIResponseMock from "./ResponseMocks/SteamAPIMockResponse.json";
import WikipediaMockResponse from "./ResponseMocks/WikipediaMockResponse.json";
import {setMALResponseMock, setMusicBrainzResponseMock, setOMDbResponseMock, setSteamResponseMock, setWikipediaResponseMock} from './mockHelpers';
import MALMockMovie from './ResponseMocks/MALMockMovie.json';
import MusicBrainzResponseMock from './ResponseMocks/MusicBrainzMockResponse.json';
import OMDBMockMovie from './ResponseMocks/OMDBMockResponse.json';
import SteamAPIResponseMock from './ResponseMocks/SteamAPIMockResponse.json';
import WikipediaMockResponse from './ResponseMocks/WikipediaMockResponse.json';
enableFetchMocks();
export let apiMock: OMDbAPI | MALAPI | LocGovAPI | MusicBrainzAPI | SteamAPI | WikipediaAPI;
@ -24,8 +24,8 @@ describe.each(
{name: LocGovAPI},
{name: MusicBrainzAPI},
{name: SteamAPI},
{ name: WikipediaAPI }
]
{name: WikipediaAPI},
],
)('$name.name', ({name: parameterizedApi}) => {
beforeAll(() => {
let settingsMock: MediaDbPluginSettings = {} as MediaDbPluginSettings;
@ -33,45 +33,45 @@ describe.each(
pluginMock.settings = settingsMock;
// TODO: add fake API key?
apiMock = new parameterizedApi(pluginMock);
})
});
beforeEach(() => {
fetchMock.resetMocks();
})
test("searchByTitle behavior when API returns garbage data", async () => {
const garbageResponse = JSON.stringify({
data: "string"
});
fetchMock.mockResponseOnce(garbageResponse)
await expect(apiMock.searchByTitle("sample")).resolves.toEqual([]);
test('searchByTitle behavior when API returns garbage data', async () => {
const garbageResponse = JSON.stringify({
data: 'string',
});
fetchMock.mockResponseOnce(garbageResponse);
await expect(apiMock.searchByTitle('sample')).resolves.toEqual([]);
// }
expect(fetch).toHaveBeenCalledTimes(1);
});
test("searchByTitle behavior when requestUrl/fetch returns 401", async () => {
test('searchByTitle behavior when requestUrl/fetch returns 401', async () => {
let sampleResponse = {
data: "string"
data: 'string',
};
fetchMock.mockResponse(JSON.stringify(sampleResponse), {status: 401});
// TODO: Check API name and fix message
// TODO: Externalize string
await expect(apiMock.searchByTitle("sample")).rejects.toThrow(`MDB | Received status code ${401} from an API.`);
await expect(apiMock.searchByTitle('sample')).rejects.toThrow(`MDB | Received status code ${401} from an API.`);
expect(fetchMock).toHaveBeenCalledTimes(1);
});
test("searchByTitle behavior when requestUrl/fetch returns 403", async () => {
test('searchByTitle behavior when requestUrl/fetch returns 403', async () => {
let sampleResponse = {
data: "string"
data: 'string',
};
fetchMock.mockResponse(JSON.stringify(sampleResponse), {status: 403});
// TODO: Check API name and fix message
// TODO: Externalize string/import?
await expect(apiMock.searchByTitle("sample")).rejects.toThrow(`MDB | Received status code ${403} from an API.`);
await expect(apiMock.searchByTitle('sample')).rejects.toThrow(`MDB | Received status code ${403} from an API.`);
expect(fetchMock).toHaveBeenCalledTimes(1);
});
test("searchByTitle behavior when requestUrl/fetch returns 200", async () => {
test('searchByTitle behavior when requestUrl/fetch returns 200', async () => {
let sampleResponse;
let ret;
switch (parameterizedApi) {
@ -104,7 +104,7 @@ describe.each(
fetchMock.mockResponse(JSON.stringify(sampleResponse), {status: 200});
// TODO: Check API name and fix message
// TODO: Externalize string
await expect(apiMock.searchByTitle("Hooking Season Playtest")).resolves.toEqual(ret);
await expect(apiMock.searchByTitle('Hooking Season Playtest')).resolves.toEqual(ret);
expect(fetchMock).toHaveBeenCalledTimes(1);
});
})
});

View file

@ -1,14 +1,14 @@
import { GameModel } from "../models/GameModel";
import {GameModel} from '../models/GameModel';
import {MovieModel} from '../models/MovieModel';
import { MusicReleaseModel } from "../models/MusicReleaseModel";
import {MusicReleaseModel} from '../models/MusicReleaseModel';
import {WikiModel} from '../models/WikiModel';
import { MediaType } from "../utils/MediaType";
import { apiMock } from "./ParameterizedAPI.test";
import MALMockMovie from "./ResponseMocks/MALMockMovie.json";
import MusicBrainzResponseMock from "./ResponseMocks/MusicBrainzMockResponse.json";
import OMDBMockMovie from "./ResponseMocks/OMDBMockResponse.json";
import SteamAPIResponseMock from "./ResponseMocks/SteamAPIMockResponse.json";
import WikipediaMockResponse from "./ResponseMocks/WikipediaMockResponse.json";
import {MediaType} from '../utils/MediaType';
import {apiMock} from './ParameterizedAPI.test';
import MALMockMovie from './ResponseMocks/MALMockMovie.json';
import MusicBrainzResponseMock from './ResponseMocks/MusicBrainzMockResponse.json';
import OMDBMockMovie from './ResponseMocks/OMDBMockResponse.json';
import SteamAPIResponseMock from './ResponseMocks/SteamAPIMockResponse.json';
import WikipediaMockResponse from './ResponseMocks/WikipediaMockResponse.json';
export function setWikipediaResponseMock() {
let ret = [];
@ -55,22 +55,20 @@ export function setMALResponseMock() {
export function setSteamResponseMock() {
let ret = [];
let steamResponse = SteamAPIResponseMock.applist.apps[0];
ret.push(
new GameModel({
ret.push(new GameModel({
type: MediaType.Game,
title: steamResponse.name,
englishTitle: steamResponse.name,
year: '',
dataSource: apiMock.apiName,
id: steamResponse.appid,
})
)
}));
return ret;
}
export function setMusicBrainzResponseMock() {
let ret = [];
let result = MusicBrainzResponseMock["release-groups"][0];
let result = MusicBrainzResponseMock['release-groups'][0];
ret.push(new MusicReleaseModel({
type: 'musicRelease',
title: result.title,

View file

@ -1,4 +1,4 @@
import { wrapAround, containsOnlyLettersAndUnderscores, replaceIllegalFileNameCharactersInString} from '../utils/Utils';
import {containsOnlyLettersAndUnderscores, replaceIllegalFileNameCharactersInString, wrapAround} from '../utils/Utils';
test('If wrapAround wraps correctly', () => {
expect(wrapAround(100, 5)).toBe(0);
@ -9,16 +9,21 @@ test('If wrapAround errors out when dividing by zero', () => {
expect(wrapAround(100, 0)).toThrow();
});
test('Letter and underscore string validity', () => {
expect(containsOnlyLettersAndUnderscores("asdkfj_")).toBe(true);
expect(containsOnlyLettersAndUnderscores("asdkfj0")).toBe(false);
test('If wrapAround errors out when size is negative', () => {
expect(wrapAround(100, -5)).toThrow();
});
test('Letter and underscore string validity', () => {
expect(containsOnlyLettersAndUnderscores('asdkfj_')).toBe(true);
expect(containsOnlyLettersAndUnderscores('asdkfj0')).toBe(false);
});
// since this is used to check if a string is a valid name for an object property, unicode characters shouldn't be allowed, thus the name of the function is misleading
test('Letter and underscore unicode char test', () => {
expect(containsOnlyLettersAndUnderscores("asdkaÈj")).toBe(true);
expect(containsOnlyLettersAndUnderscores("asdkaÈj0")).toBe(false);
expect(containsOnlyLettersAndUnderscores('asdkaÈj')).toBe(true);
expect(containsOnlyLettersAndUnderscores('asdkaÈj0')).toBe(false);
});
test('Valid filename test', () => {
expect(replaceIllegalFileNameCharactersInString("what?is\\this:")).toBe("whatisthis -");
})
expect(replaceIllegalFileNameCharactersInString('what?is\\this:')).toBe('whatisthis -');
});

View file

@ -8,7 +8,10 @@ export const mediaDbVersion: string = '0.3.2';
export const debug: boolean = true;
export function wrapAround(value: number, size: number): number {
return ((value % size) + size) % size;
if (size <= 0) {
throw Error('size may not be zero or negative');
}
return mod(value, size);
}
export function debugLog(o: any): void {