Skip to content

Commit

Permalink
Added state wiring for marking a comic as read [#19]
Browse files Browse the repository at this point in the history
  • Loading branch information
mcpierce committed Jun 21, 2020
1 parent 024ea6c commit 620c80a
Show file tree
Hide file tree
Showing 17 changed files with 485 additions and 15 deletions.
28 changes: 26 additions & 2 deletions comixed-frontend/src/app/comics/actions/comic.actions.ts
Expand Up @@ -49,7 +49,10 @@ export enum ComicActionTypes {
DeleteComicFailed = '[COMIC] Failed to delete comic from the library',
RestoreComic = '[COMIC] Unmark a comic for deletion',
RestoreComicSucceeded = '[COMIC] Comic unmarked for deletion',
RestoreComicFailed = '[COMIC] Failed to unmark a comic for deletion'
RestoreComicFailed = '[COMIC] Failed to unmark a comic for deletion',
MarkAsRead = '[COMIC] Change the read state of a comic',
MarkedAsRead = '[COMIC} The read state of a comic was changed',
MarkAsReadFailed = '[COMIC] Changing the read state of a comic failed'
}

export class ComicGetScanTypes implements Action {
Expand Down Expand Up @@ -232,6 +235,24 @@ export class ComicRestoreFailed implements Action {
constructor() {}
}

export class ComicMarkAsRead implements Action {
readonly type = ComicActionTypes.MarkAsRead;

constructor(public payload: { comic: Comic; read: boolean }) {}
}

export class ComicMarkedAsRead implements Action {
readonly type = ComicActionTypes.MarkedAsRead;

constructor(public payload: { lastRead: number }) {}
}

export class ComicMarkAsReadFailed implements Action {
readonly type = ComicActionTypes.MarkAsReadFailed;

constructor() {}
}

export type ComicActions =
| ComicGetScanTypes
| ComicGotScanTypes
Expand Down Expand Up @@ -262,4 +283,7 @@ export type ComicActions =
| ComicDeleteFailed
| ComicRestore
| ComicRestored
| ComicRestoreFailed;
| ComicRestoreFailed
| ComicMarkAsRead
| ComicMarkedAsRead
| ComicMarkAsReadFailed;
129 changes: 129 additions & 0 deletions comixed-frontend/src/app/comics/adaptors/comic.adaptor.spec.ts
Expand Up @@ -35,6 +35,9 @@ import {
ComicGotIssue,
ComicGotPageTypes,
ComicGotScanTypes,
ComicMarkAsRead,
ComicMarkAsReadFailed,
ComicMarkedAsRead,
ComicRestore,
ComicRestored,
ComicRestoreFailed,
Expand All @@ -60,12 +63,14 @@ import * as fromComics from 'app/comics/reducers/comic.reducer';
import { MessageService } from 'primeng/api';
import { ComicAdaptor } from './comic.adaptor';
import { LoggerModule } from '@angular-ru/logger';
import { COMIC_1_LAST_READ_DATE } from 'app/library/models/last-read-date.fixtures';

describe('ComicAdaptor', () => {
const SCAN_TYPES = [SCAN_TYPE_1, SCAN_TYPE_3, SCAN_TYPE_5];
const FORMATS = [FORMAT_1, FORMAT_3, FORMAT_5];
const COMIC = COMIC_1;
const SKIP_CACHE = false;
const LAST_READ_DATE = COMIC_1_LAST_READ_DATE;

let adaptor: ComicAdaptor;
let store: Store<AppState>;
Expand Down Expand Up @@ -355,4 +360,128 @@ describe('ComicAdaptor', () => {
});
});
});

describe('marking a comic as read', () => {
beforeEach(() => {
store.dispatch(
new ComicGotIssue({ comic: { ...COMIC, lastRead: null } })
);
adaptor.markAsRead(COMIC);
});

it('fires an action', () => {
expect(store.dispatch).toHaveBeenCalledWith(
new ComicMarkAsRead({ comic: COMIC, read: true })
);
});

it('provides updates on marking the comic', () => {
adaptor.markingAsRead$.subscribe(response =>
expect(response).toBeTruthy()
);
});

describe('success', () => {
beforeEach(() => {
store.dispatch(
new ComicMarkedAsRead({ lastRead: LAST_READ_DATE.lastRead })
);
});

it('provides updates on marking the comic', () => {
adaptor.markingAsRead$.subscribe(response =>
expect(response).toBeFalsy()
);
});

it('provides updates on the comic', () => {
adaptor.comic$.subscribe(response =>
expect(response).toEqual({
...COMIC,
lastRead: LAST_READ_DATE.lastRead
})
);
});
});

describe('failure', () => {
beforeEach(() => {
store.dispatch(new ComicMarkAsReadFailed());
});

it('provides updates on marking the comic', () => {
adaptor.markingAsRead$.subscribe(response =>
expect(response).toBeFalsy()
);
});

it('provides updates on the comic', () => {
adaptor.comic$.subscribe(response =>
expect(response.lastRead).toBeNull()
);
});
});
});

describe('marking a comic as not read', () => {
beforeEach(() => {
store.dispatch(
new ComicGotIssue({
comic: { ...COMIC, lastRead: LAST_READ_DATE.lastRead }
})
);
adaptor.markAsUnread(COMIC);
});

it('fires an action', () => {
expect(store.dispatch).toHaveBeenCalledWith(
new ComicMarkAsRead({ comic: COMIC, read: false })
);
});

it('provides updates on marking the comic', () => {
adaptor.markingAsRead$.subscribe(response =>
expect(response).toBeTruthy()
);
});

describe('success', () => {
beforeEach(() => {
store.dispatch(new ComicMarkedAsRead({ lastRead: null }));
});

it('provides updates on marking the comic', () => {
adaptor.markingAsRead$.subscribe(response =>
expect(response).toBeFalsy()
);
});

it('provides updates on the comic', () => {
adaptor.comic$.subscribe(response =>
expect(response).toEqual({
...COMIC,
lastRead: null
})
);
});
});

describe('failure', () => {
beforeEach(() => {
store.dispatch(new ComicMarkAsReadFailed());
});

it('provides updates on marking the comic', () => {
adaptor.markingAsRead$.subscribe(response =>
expect(response).toBeFalsy()
);
});

it('provides updates on the comic', () => {
adaptor.comic$.subscribe(response =>
expect(response.lastRead).toEqual(LAST_READ_DATE.lastRead)
);
});
});
});
});
19 changes: 19 additions & 0 deletions comixed-frontend/src/app/comics/adaptors/comic.adaptor.ts
Expand Up @@ -32,6 +32,7 @@ import {
ComicGetFormats,
ComicGetIssue,
ComicGetScanTypes,
ComicMarkAsRead,
ComicRestore,
ComicSave,
ComicSavePage,
Expand Down Expand Up @@ -60,6 +61,7 @@ export class ComicAdaptor {
private _comic$ = new BehaviorSubject<Comic>(null);
private _deletingComic$ = new BehaviorSubject<boolean>(false);
private _restoringComic$ = new BehaviorSubject<boolean>(false);
private _markingAsRead$ = new BehaviorSubject<boolean>(false);

constructor(private logger: LoggerService, private store: Store<AppState>) {
this.store
Expand Down Expand Up @@ -103,6 +105,9 @@ export class ComicAdaptor {
if (!_.isEqual(state.comic, this._comic$.getValue())) {
this._comic$.next(state.comic);
}
if (state.settingReadState !== this._markingAsRead$.getValue()) {
this._markingAsRead$.next(state.settingReadState);
}
});
}

Expand Down Expand Up @@ -211,4 +216,18 @@ export class ComicAdaptor {
get restoringComic$(): Observable<boolean> {
return this._restoringComic$.asObservable();
}

markAsRead(comic: Comic): void {
this.logger.debug('marking comic as read:', comic);
this.store.dispatch(new ComicMarkAsRead({ comic: comic, read: true }));
}

get markingAsRead$(): Observable<boolean> {
return this._markingAsRead$.asObservable();
}

markAsUnread(comic: Comic): void {
this.logger.debug('marking comic as unread:', comic);
this.store.dispatch(new ComicMarkAsRead({ comic: comic, read: false }));
}
}
2 changes: 2 additions & 0 deletions comixed-frontend/src/app/comics/comics.constants.ts
Expand Up @@ -28,6 +28,8 @@ export const DELETE_COMIC_URL = `${API_ROOT_URL}/comics/\${id}`;
export const RESTORE_COMIC_URL = `${API_ROOT_URL}/comics/\${id}/restore`;
export const DOWNLOAD_COMIC_URL = `${API_ROOT_URL}/comics/\${id}/download`;
export const GET_COMIC_COVER_URL = `${API_ROOT_URL}/comics/\${id}/cover/content`;
export const MARK_COMIC_AS_READ_URL = `${API_ROOT_URL}/comics/\${id}/read`;
export const MARK_COMIC_AS_UNREAD_URL = `${API_ROOT_URL}/comics/\${id}/read`;

export const MISSING_COMIC_IMAGE_URL = '/assets/img/missing-comic-file.png';

Expand Down
Expand Up @@ -30,6 +30,7 @@ import { MessageService } from 'primeng/api';
import { StoreModule } from '@ngrx/store';
import { COMIC_FEATURE_KEY, reducer } from 'app/comics/reducers/comic.reducer';
import { ComicEffects } from 'app/comics/effects/comic.effects';
import { LoggerModule } from '@angular-ru/logger';

describe('ComicStoryComponent', () => {
let component: ComicStoryComponent;
Expand All @@ -41,6 +42,7 @@ describe('ComicStoryComponent', () => {
HttpClientTestingModule,
RouterTestingModule,
TranslateModule.forRoot(),
LoggerModule.forRoot(),
StoreModule.forRoot({}),
StoreModule.forFeature(COMIC_FEATURE_KEY, reducer),
EffectsModule.forRoot([]),
Expand Down

0 comments on commit 620c80a

Please sign in to comment.