/********************************************************************************
 * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 ********************************************************************************/


import { async, TestBed, inject } from '@angular/core/testing';
import { BaseRequestOptions, Http, HttpModule, Response, ResponseOptions } from '@angular/http';
import { MockBackend } from '@angular/http/testing';

import { PreferenceService, Scope } from '../core/preference.service';
import { PropertyService } from '../core/property.service';
import { HttpErrorHandler } from '../core/http-error-handler';
import { BasketService } from './basket.service';

describe('BasketService', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpModule],
      providers: [
        BasketService,
        PropertyService,
        PreferenceService,
        MockBackend,
        BaseRequestOptions,
        HttpErrorHandler,
        {
          provide: Http,
          useFactory: (mockBackend, options) => {
            return new Http(mockBackend, options);
          },
          deps: [MockBackend, BaseRequestOptions]
        }
      ]
    });
  });


  describe('getFileExtension()', () => {
    it('should return value configured in preference', async(inject([BasketService, MockBackend], (basketService, mockBackend) => {

      mockBackend.connections.subscribe(conn => {

        let mockResponse = {
          preferences: [
          {
            id: 2,
            key: 'shoppingbasket.fileextensions',
            scope: Scope.SYSTEM,
            source: null,
            user: null,
            value: '[ { "label": "MyTool", "extension": "mdm-mytool" }, { "label": "OtherTool", "extension": "mdm-other" } ]'
          }
        ]};
        conn.mockRespond(new Response(new ResponseOptions({ body: mockResponse })));
      });

      basketService.getFileExtensions().subscribe(
        ext => expect(ext).toEqual([
          { 'label': 'MyTool', 'extension': 'mdm-mytool' },
          { 'label': 'OtherTool', 'extension': 'mdm-other' } ]),
        err => expect(err).toBeUndefined());
    })));

    it('should return empty array (default) if no preferences were found',
        async(inject([BasketService, MockBackend], (basketService, mockBackend) => {

      mockBackend.connections.subscribe(conn => {
        conn.mockRespond(new Response(new ResponseOptions({ body: { preferences: [] } })));
      });

      basketService.getFileExtensions().subscribe(
        ext => expect(ext).toEqual([]),
        err => expect(err).toBeUndefined());
    })));

    it('should return empty array (default) if no preferences value is invalid',
        async(inject([BasketService, MockBackend], (basketService, mockBackend) => {

      mockBackend.connections.subscribe(conn => {
        let mockResponse = {
          preferences: [
          {
            id: 2,
            key: 'shoppingbasket.fileextensions',
            scope: Scope.SYSTEM,
            source: null,
            user: null,
            value: 'asdf'
          }
        ]};
        conn.mockRespond(new Response(new ResponseOptions({ body: mockResponse })));
      });

      basketService.getFileExtensions().subscribe(
        ext => expect(ext).toEqual([]));
    })));
  });
});
