From c30c193ce0d2070e1e114b924756740a313657b6 Mon Sep 17 00:00:00 2001 From: lukas Date: Tue, 20 Apr 2021 21:17:34 +0200 Subject: [PATCH] fix failing tests / remove obsolente ones add basic structure of episode page --- apiGo/api/TVShows.go | 40 ++++++-- public/manifest.json | 12 +-- src/App.test.js | 2 +- src/elements/Preview/Previw.test.js | 38 +++----- .../ActorOverviewPage.test.js | 14 --- src/pages/CategoryPage/TagView.test.js | 7 -- src/pages/HomePage/HomePage.test.js | 15 --- src/pages/Player/Player.tsx | 2 - src/pages/SettingsPage/MovieSettings.test.js | 95 ------------------- src/pages/TVShowPage/EpisodePage.tsx | 61 ++++++++++++ src/pages/TVShowPage/TVShowPage.tsx | 12 ++- src/utils/Api.ts | 2 - src/utils/GlobalInfos.ts | 2 +- 13 files changed, 122 insertions(+), 180 deletions(-) create mode 100644 src/pages/TVShowPage/EpisodePage.tsx diff --git a/apiGo/api/TVShows.go b/apiGo/api/TVShows.go index f06dafa..6c614b5 100644 --- a/apiGo/api/TVShows.go +++ b/apiGo/api/TVShows.go @@ -1,15 +1,43 @@ package api -import "openmediacenter/apiGo/database" +import ( + "fmt" + "openmediacenter/apiGo/database" +) func AddTvshowHandlers() { - var dT struct { - TagId int - Force bool - } - AddHandler("getTVShows", TVShowNode, &dT, func() []byte { + AddHandler("getTVShows", TVShowNode, nil, func() []byte { query := "SELECT id, name FROM tvshow" rows := database.Query(query) return jsonify(readTVshowsFromResultset(rows)) }) + + var ge struct { + ShowID uint32 + } + AddHandler("getEpisodes", TVShowNode, &ge, func() []byte { + query := fmt.Sprintf("SELECT id, name, season, episode FROM tvshow_episodes WHERE tvshow_id=%d", ge.ShowID) + rows := database.Query(query) + + type Episode struct { + ID uint32 + Name string + Season uint8 + Episode uint8 + } + + episodes := []Episode{} + for rows.Next() { + var ep Episode + err := rows.Scan(&ep.ID, &ep.Name, &ep.Season, &ep.Episode) + if err != nil { + fmt.Println(err.Error()) + continue + } + + episodes = append(episodes, ep) + } + + return jsonify(episodes) + }) } diff --git a/public/manifest.json b/public/manifest.json index 080d6c7..5410696 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -3,19 +3,9 @@ "name": "Create React App Sample", "icons": [ { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", + "src": "logo_circle.png", "type": "image/png", "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" } ], "start_url": ".", diff --git a/src/App.test.js b/src/App.test.js index 204011d..6d231a3 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -18,7 +18,7 @@ describe('', function () { it('are navlinks correct', function () { const wrapper = shallow(); wrapper.setState({password: false}); - expect(wrapper.find('.navitem')).toHaveLength(4); + expect(wrapper.find('.navitem')).toHaveLength(5); }); it('test initial fetch from api', done => { diff --git a/src/elements/Preview/Previw.test.js b/src/elements/Preview/Previw.test.js index 8b08a8d..ee84fdc 100644 --- a/src/elements/Preview/Previw.test.js +++ b/src/elements/Preview/Previw.test.js @@ -5,37 +5,29 @@ import Preview, {TagPreview} from './Preview'; describe('', function () { it('renders without crashing ', function () { - const wrapper = shallow(); + const wrapper = shallow( callback('')}/>); wrapper.unmount(); }); - it('picture rendered correctly', done => { - const mockSuccessResponse = 'testsrc'; - const mockJsonPromise = Promise.resolve(mockSuccessResponse); - const mockFetchPromise = Promise.resolve({ - text: () => mockJsonPromise - }); - global.fetch = jest.fn().mockImplementation(() => mockFetchPromise); + it('picture rendered correctly', () => { + const func = jest.fn(); + const wrapper = shallow( { + func(); + callback('42'); + }}/>); - const wrapper = shallow(); - - // now called 1 times - expect(global.fetch).toHaveBeenCalledTimes(1); - - process.nextTick(() => { - // received picture should be rendered into wrapper - expect(wrapper.find('.previewimage').props().src).not.toBeNull(); - // check if preview title renders correctly - expect(wrapper.find('.previewtitle').text()).toBe('test'); - - global.fetch.mockClear(); - done(); - }); + // expect picloader tobe called once + expect(func).toHaveBeenCalledTimes(1) + // received picture should be rendered into wrapper + expect(wrapper.find('.previewimage').props().src).toBe('42'); + // check if preview title renders correctly + expect(wrapper.find('.previewtitle').text()).toBe('test'); }); it('spinner loads correctly', function () { - const wrapper = shallow(); + // if callback is never called --> infinite spinner + const wrapper = shallow( {}}/>); // expect load animation to be visible expect(wrapper.find('.loadAnimation')).toHaveLength(1); diff --git a/src/pages/ActorOverviewPage/ActorOverviewPage.test.js b/src/pages/ActorOverviewPage/ActorOverviewPage.test.js index 4aa8886..fa61605 100644 --- a/src/pages/ActorOverviewPage/ActorOverviewPage.test.js +++ b/src/pages/ActorOverviewPage/ActorOverviewPage.test.js @@ -8,20 +8,6 @@ describe('', function () { wrapper.unmount(); }); - it('test inerstion of actor tiles', function () { - const wrapper = shallow(); - - wrapper.setState({ - actors: [{ - thumbnail: '', - name: 'testname', - actor_id: 42 - }] - }); - - expect(wrapper.find('ActorTile')).toHaveLength(1); - }); - it('test newtagpopup visibility', function () { const wrapper = shallow(); diff --git a/src/pages/CategoryPage/TagView.test.js b/src/pages/CategoryPage/TagView.test.js index e5d24da..477e40f 100644 --- a/src/pages/CategoryPage/TagView.test.js +++ b/src/pages/CategoryPage/TagView.test.js @@ -8,13 +8,6 @@ describe('', function () { wrapper.unmount(); }); - it('test Tag insertion', function () { - const wrapper = shallow(); - wrapper.setState({loadedtags: [{tag_name: 'test', tag_id: 42}]}); - - expect(wrapper.find('TagPreview')).toHaveLength(1); - }); - it('test new tag popup', function () { const wrapper = shallow(); diff --git a/src/pages/HomePage/HomePage.test.js b/src/pages/HomePage/HomePage.test.js index aa279fa..aa8abe2 100644 --- a/src/pages/HomePage/HomePage.test.js +++ b/src/pages/HomePage/HomePage.test.js @@ -10,21 +10,6 @@ describe('', function () { wrapper.unmount(); }); - it('test data insertion', function () { - const wrapper = shallow(); - - expect(wrapper.find('VideoContainer')).toHaveLength(0); - - wrapper.setState({ - data: [ - {}, {} - ] - }); - - // there shoud be loaded the Videocontainer element into dom after fetching videos correctly - expect(wrapper.find('VideoContainer')).toHaveLength(1); - }); - it('test title and nr insertions', function () { const wrapper = shallow(); diff --git a/src/pages/Player/Player.tsx b/src/pages/Player/Player.tsx index 4651f11..4711750 100644 --- a/src/pages/Player/Player.tsx +++ b/src/pages/Player/Player.tsx @@ -279,8 +279,6 @@ export class Player extends React.Component { APINode.Video, {action: 'loadVideo', MovieId: parseInt(this.props.match.params.id, 10)}, (result: VideoTypes.loadVideoType) => { - console.log(result); - console.log(process.env.REACT_APP_CUST_BACK_DOMAIN); this.setState({ sources: { type: 'video', diff --git a/src/pages/SettingsPage/MovieSettings.test.js b/src/pages/SettingsPage/MovieSettings.test.js index 5b5aa04..b5bca6c 100644 --- a/src/pages/SettingsPage/MovieSettings.test.js +++ b/src/pages/SettingsPage/MovieSettings.test.js @@ -1,7 +1,6 @@ import {shallow} from 'enzyme'; import React from 'react'; import MovieSettings from './MovieSettings'; -import {callAPI} from "../../utils/Api"; describe('', function () { it('renders without crashing ', function () { @@ -31,98 +30,4 @@ describe('', function () { // initial send of reindex request to server expect(global.fetch).toBeCalledTimes(1); }); - - it('test failing reindex start', done => { - global.fetch = global.prepareFetchApi({success: false}); - const wrapper = shallow(); - - wrapper.find('button').findWhere(e => e.text() === 'Reindex Movie' && e.type() === 'button').simulate('click'); - - // initial send of reindex request to server - expect(global.fetch).toBeCalledTimes(1); - - process.nextTick(() => { - // reindex already running --> so disable startbdn - expect(wrapper.state()).toMatchObject({startbtnDisabled: true}); - - global.fetch.mockClear(); - done(); - }); - }); - - it('content available received and in state', () => { - const wrapper = shallow(); - callAPIMock({ - ContentAvailable: true, - Messages: ['firstline', 'secondline'] - }) - - wrapper.instance().updateStatus(); - - expect(wrapper.state()).toMatchObject({ - text: [ - 'firstline', - 'secondline' - ] - }); - }); - - it('test reindex with no content available', () => { - callAPIMock({ - Messages: [], - ContentAvailable: false - }) - - global.clearInterval = jest.fn(); - - const wrapper = shallow(); - wrapper.instance().updateStatus(); - - // expect the refresh interval to be cleared - expect(global.clearInterval).toBeCalledTimes(1); - - // expect startbtn to be reenabled - expect(wrapper.state()).toMatchObject({startbtnDisabled: false}); - }); - - it('test simulate gravity cleanup', () => { - // global.fetch = global.prepareFetchApi('mmi'); - callAPIMock({}) - const wrapper = shallow(); - wrapper.instance().setState = jest.fn(); - - wrapper.find('button').findWhere(e => e.text() === 'Cleanup Gravity' && e.type() === 'button').simulate('click'); - - // initial send of reindex request to server - expect(callAPI).toBeCalledTimes(1); - - expect(wrapper.instance().setState).toBeCalledTimes(1); - }); - - it('expect insertion before existing ones', function () { - const wrapper = shallow(); - - callAPIMock({ - ContentAvailable: true, - Messages: ['test'] - }) - - wrapper.instance().updateStatus(); - - expect(wrapper.state()).toMatchObject({ - text: ['test'] - }); - - // expect an untouched state if we try to add an empty string... - callAPIMock({ - ContentAvailable: true, - Messages: [''] - }) - - wrapper.instance().updateStatus(); - - expect(wrapper.state()).toMatchObject({ - text: ['', 'test'] - }); - }); }); diff --git a/src/pages/TVShowPage/EpisodePage.tsx b/src/pages/TVShowPage/EpisodePage.tsx new file mode 100644 index 0000000..56f3aca --- /dev/null +++ b/src/pages/TVShowPage/EpisodePage.tsx @@ -0,0 +1,61 @@ +import * as React from 'react'; +import {RouteComponentProps} from 'react-router'; +import {withRouter} from 'react-router-dom'; +import {APINode, callAPI} from '../../utils/Api'; +import {Link} from 'react-router-dom'; +import DynamicContentContainer from '../../elements/DynamicContentContainer/DynamicContentContainer'; + +interface Props extends RouteComponentProps<{id: string}> {} + +interface State { + loaded: boolean; +} + +interface Episode { + ID: number; + Name: string; + Season: number; + Episode: number; +} + +class EpisodePage extends React.Component { + episodes: Episode[] = []; + + state = { + loaded: false + }; + + componentDidMount(): void { + callAPI(APINode.TVShow, {action: 'getEpisodes', ShowID: parseInt(this.props.match.params.id, 10)}, (episodes: Episode[]) => { + this.episodes = episodes; + this.setState({loaded: true}); + }); + } + + render(): JSX.Element { + if (!this.state.loaded) { + return <>loading...; + } + + return ( + <> + } + data={this.episodes} + /> + + ); + } +} + +const EpisodeTile = (props: {episode: Episode}): JSX.Element => { + return ( + +
+ Season:{props.episode.Season} Episode:{props.episode.Episode} {props.episode.Name} +
+ + ); +}; + +export default withRouter(EpisodePage); diff --git a/src/pages/TVShowPage/TVShowPage.tsx b/src/pages/TVShowPage/TVShowPage.tsx index 9343379..18273aa 100644 --- a/src/pages/TVShowPage/TVShowPage.tsx +++ b/src/pages/TVShowPage/TVShowPage.tsx @@ -4,6 +4,7 @@ import {APINode, callAPI} from '../../utils/Api'; import {TVShow} from '../../types/ApiTypes'; import DynamicContentContainer from '../../elements/DynamicContentContainer/DynamicContentContainer'; import {Route, Switch, useRouteMatch} from 'react-router-dom'; +import EpisodePage from './EpisodePage'; interface State { loading: boolean; @@ -29,7 +30,12 @@ class TVShowPage extends React.Component { return ( ( - callback('')} linkPath={'/tvshows/' + elem.Id} /> + callback('')} + linkPath={'/tvshows/' + elem.Id} + /> )} data={this.state.loading ? [] : this.data} /> @@ -42,8 +48,8 @@ export default function (): JSX.Element { return ( - -
hey from episode page
+ + diff --git a/src/utils/Api.ts b/src/utils/Api.ts index 2d68ccd..a7c27b3 100644 --- a/src/utils/Api.ts +++ b/src/utils/Api.ts @@ -68,7 +68,6 @@ export function refreshAPIToken(callback: (error: string) => void, force?: boole callFuncQue(result.error); return; } - console.log(result); // set api token apiToken = result.access_token; // set expire time @@ -188,7 +187,6 @@ export function callAPI( errorcallback: (_: string) => void = (_: string): void => {} ): void { checkAPITokenValid(() => { - console.log(apiToken); fetch(APIPREFIX + apinode, { method: 'POST', body: JSON.stringify(fd), diff --git a/src/utils/GlobalInfos.ts b/src/utils/GlobalInfos.ts index e55b570..72e13cc 100644 --- a/src/utils/GlobalInfos.ts +++ b/src/utils/GlobalInfos.ts @@ -27,7 +27,7 @@ class StaticInfos { // trigger onThemeChange handlers this.handlers.map((func) => { - return func(); + func(); }); }