Files
2025-08-06 13:49:11 +08:00

160 lines
5.7 KiB
JavaScript

/* global describe: true, test:true, expect:true */
import { albums as albumsReducer, initialState } from '~/reducers/albums';
import _ from 'lodash';
import {
GET_ALBUMS,
CREATE_ALBUM,
GET_ALBUMS_SUCCESS,
GET_ALBUMS_ERROR,
CREATE_ALBUM_ERROR,
GET_ALBUM_CONTENT,
GET_ALBUM_CONTENT_SUCCESS,
GET_ALBUM_CONTENT_ERROR,
CREATE_ALBUM_SUCCESS,
LOGOUT_SUCCESS,
} from '~/store/actionTypes';
import {
DEFAULT_ALBUM_NAME,
DEFAULT_ALBUM_TYPE,
} from '~/store/contentTypes';
describe('albums reducer', () => {
test('CASE 1: should return initial state', () => {
expect(albumsReducer(undefined, { type: 'Default' }))
.toEqual(initialState);
});
test('CASE 2: should return state with loading when type is GET_ALBUMS or CREATE_ALBUM', () => {
const expectedState = { ...initialState, meta: { ...initialState.meta, loading: true } };
expect(albumsReducer(initialState, { type: GET_ALBUMS })).toEqual(expectedState);
expect(albumsReducer(initialState, { type: CREATE_ALBUM })).toEqual(expectedState);
});
test('CASE 3: should return albums with meta property when type is GET_ALBUMS_SUCCESS', () => {
const albums = [{ id: 1 }, { id: 2 }];
const stateResult = albumsReducer(undefined, { type: GET_ALBUMS_SUCCESS, payload: { albums } });
expect(stateResult).toHaveProperty('albums');
expect(stateResult.albums).toHaveLength(albums.length);
stateResult.albums.forEach(album => {
expect(album).toHaveProperty('meta');
});
});
test('CASE 5: should return correct state when type is GET_ALBUMS_ERROR or CREATE_ALBUM_ERROR', () => {
const albumErr = new Error('getAlbumsError');
const expectedState = { ...initialState, meta: { error: albumErr, loading: false } };
expect(albumsReducer(initialState, {
type: GET_ALBUMS_ERROR,
payload: { error: albumErr },
})).toEqual(expectedState);
expect(albumsReducer(initialState, {
type: CREATE_ALBUM_ERROR,
payload: { error: albumErr },
})).toEqual(expectedState);
});
test('CASE 6: should return state with album loading to TRUE when type is GET_ALBUM_CONTENT', () => {
const albums = [{ id: 1 }, { id: 2 }];
const payload = {
albumId: 1,
};
const originalState = { ...initialState, albums, meta: { error: '' } };
const stateResult = albumsReducer({ ...originalState, albums, meta: { error: '' } }, {
type: GET_ALBUM_CONTENT,
payload,
});
const expectedStateAlbums = [
{ id: 1, meta: { error: '', loading: true } },
{ id: 2 },
];
expect(stateResult.albums).toEqual(expectedStateAlbums);
});
test('CASE 7: should return state with album content when type is GET_ALBUM_CONTENT_SUCCESS', () => {
const albums = [{ id: 1 }, { id: 2 }];
const content = [
{ id: 5 }, // photo id
{ id: 4 }, // photo id
];
const payload = {
albumId: 1,
content,
};
const originalState = { ...initialState, albums, meta: { error: '' } };
const stateResult = albumsReducer({ ...originalState, albums, meta: { error: '' } }, {
type: GET_ALBUM_CONTENT_SUCCESS,
payload,
});
expect(stateResult.albums[0]).toHaveProperty('content', _.orderBy(content, ['id'], ['desc']));
// expect(stateResult.albums[0]).toHaveProperty('cover');
// expect(stateResult.albums[0]).toHaveProperty('thumbs');
});
test('CASE 8: should return state with album error when type is GET_ALBUM_CONTENT_ERROR', () => {
const albums = [{ id: 1 }, { id: 2 }];
const albumErr = new Error('getAlbumsContentError');
const payload = {
albumId: 1,
error: albumErr,
};
const originalState = { ...initialState, albums, meta: { error: '' } };
const stateResult = albumsReducer({ ...originalState, albums, meta: { error: '' } }, {
type: GET_ALBUM_CONTENT_ERROR,
payload,
});
const expectedStateAlbums = [
{ id: 1, meta: { error: albumErr, loading: false } },
{ id: 2 },
];
expect(stateResult.albums).toEqual(expectedStateAlbums);
});
test('CASE 9: should add album on CREATE_ALBUM_SUCCESS with meta', () => {
const albums = [{ id: 2 }, { id: 3 }];
const payload = {
album: { id: 1 },
};
const originalState = { ...initialState, albums, meta: { error: '' } };
const stateResult = albumsReducer({ albums, ...originalState, meta: { error: '' } }, {
type: CREATE_ALBUM_SUCCESS,
payload,
});
const expectedStateAlbums = [
{ id: 1, meta: { error: '', loading: false } },
{ id: 2 },
{ id: 3 },
];
expect(stateResult.albums).toEqual(expectedStateAlbums);
});
test('CASE 10: should empty the state on LOGOUT_SUCCESS', () => {
const existingState = [{ id: 1 }, { id: 2 }];
expect(albumsReducer(existingState, { type: LOGOUT_SUCCESS }))
.toEqual(initialState);
});
test('CASE 11: should return albums with defaultAlbumId property when type is GET_ALBUMS_SUCCESS', () => {
const albums = [{ id: 1, name: DEFAULT_ALBUM_NAME, type: DEFAULT_ALBUM_TYPE }, { id: 2 }];
const stateResult = albumsReducer(undefined, { type: GET_ALBUMS_SUCCESS, payload: { albums } });
expect(stateResult).toHaveProperty('albums');
expect(stateResult).toHaveProperty('defaultAlbumId');
expect(stateResult.albums).toHaveLength(albums.length);
expect(stateResult.defaultAlbumId).toEqual(1);
stateResult.albums.forEach(album => {
expect(album).toHaveProperty('meta');
});
});
test('CASE 12: should return albums with defaultAlbumId 0 property when type is GET_ALBUMS_SUCCESS', () => {
const albums = [{ id: 1 }, { id: 2 }];
const stateResult = albumsReducer(undefined, { type: GET_ALBUMS_SUCCESS, payload: { albums } });
expect(stateResult).toHaveProperty('albums');
expect(stateResult).toHaveProperty('defaultAlbumId');
expect(stateResult.albums).toHaveLength(albums.length);
expect(stateResult.defaultAlbumId).toEqual(0);
stateResult.albums.forEach(album => {
expect(album).toHaveProperty('meta');
});
});
});