/* global describe: true, test:true, expect:true */
import { photoPrint as photoPrintReducer, initialState } from '~/reducers/photoPrint';
import {
	PLACE_PHOTO_PRINT_ORDER,
	PLACE_PHOTO_PRINT_ORDER_SUCCESS,
	PLACE_PHOTO_PRINT_ORDER_ERROR,
	SET_PHOTOS_TO_QUEUE,
	SET_PHOTOS_TO_QUEUE_SUCCESS,
	SET_PHOTOS_TO_QUEUE_ERROR,
	REMOVE_PHOTO_FROM_QUEUE,
	REMOVE_PHOTO_FROM_QUEUE_SUCCESS,
	REMOVE_PHOTO_FROM_QUEUE_ERROR,
} from '~/store/actionTypes';

describe('photoPrint reducer', () => {
	test('CASE 1: should return initial state', () => {
		expect(photoPrintReducer(undefined, { type: 'Default' }))
			.toEqual(initialState);
	});
	test('CASE 2: should return state with loading when type is PLACE_PHOTO_PRINT_ORDER, SET_PHOTOS_TO_QUEUE or REMOVE_PHOTO_FROM_QUEUE', () => {
		const expectedState = { ...initialState, meta: { ...initialState.meta, loading: true } };
		expect(photoPrintReducer(initialState, { type: PLACE_PHOTO_PRINT_ORDER })).toEqual(expectedState);
		expect(photoPrintReducer(initialState, { type: SET_PHOTOS_TO_QUEUE })).toEqual(expectedState);
		expect(photoPrintReducer(initialState, { type: REMOVE_PHOTO_FROM_QUEUE })).toEqual(expectedState);
	});

	test('CASE 4: should return correct state when type is PLACE_PHOTO_PRINT_ORDER_SUCCESS', () => {
		const expectedState = { ...initialState, meta: { ...initialState.meta, loading: false }, orderNumbers: ['1234567'] };
		expect(photoPrintReducer(
			initialState,
			{
				type: PLACE_PHOTO_PRINT_ORDER_SUCCESS,
				payload: {
					orderNumber: '1234567',
				},
			},
		)).toEqual(expectedState);
	});

	test('CASE 5: should return correct state when type is REMOVE_PHOTO_FROM_QUEUE_SUCCESS', () => {
		const images = ['image1', 'image2', 'image3'];
		const expectedState = {
			...initialState,
			images,
			count: 3,
			meta: {
				...initialState.meta,
				loading: false,
			},
		};
		expect(photoPrintReducer(
			initialState,
			{
				type: REMOVE_PHOTO_FROM_QUEUE_SUCCESS,
				payload: {
					images,
				},
			},
		)).toEqual(expectedState);
	});

	test('CASE 6: should return correct state when type is SET_PHOTOS_TO_QUEUE_SUCCESS', () => {
		const images = ['image1', 'image2', 'image3'];
		const expectedState = {
			...initialState,
			images,
			count:
			3,
			meta:
			{
				...initialState.meta,
				loading:
				false,
			},
		};
		expect(photoPrintReducer(
			initialState,
			{
				type: SET_PHOTOS_TO_QUEUE_SUCCESS,
				payload: {
					images,
				},
			},
		)).toEqual(expectedState);
	});


	test('CASE 7: should return error state when type is PLACE_PHOTO_PRINT_ORDER_ERROR', () => {
		const error = new Error('Error');
		const expectedState = { ...initialState, meta: { ...initialState.meta, loading: false, error } };
		expect(photoPrintReducer(
			initialState,
			{
				type: PLACE_PHOTO_PRINT_ORDER_ERROR,
				payload: { error },
			},
		)).toEqual(expectedState);
	});
	test('CASE 8: should return error state when type is SET_PHOTOS_TO_QUEUE_ERROR', () => {
		const error = new Error('Error');
		const expectedState = { ...initialState, meta: { ...initialState.meta, loading: false, error } };
		expect(photoPrintReducer(
			initialState,
			{
				type: SET_PHOTOS_TO_QUEUE_ERROR,
				payload: { error },
			},
		)).toEqual(expectedState);
	});
	test('CASE 9: should return error state when type is REMOVE_PHOTO_FROM_QUEUE_ERROR', () => {
		const error = new Error('Error');
		const expectedState = { ...initialState, meta: { ...initialState.meta, loading: false, error } };
		expect(photoPrintReducer(
			initialState,
			{
				type: REMOVE_PHOTO_FROM_QUEUE_ERROR,
				payload: { error },
			},
		)).toEqual(expectedState);
	});
});
