/********************************************************************************
 * 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 { HttpModule } from '@angular/http';
import { TestBed, async, inject } from '@angular/core/testing';

import { of as observableOf,  Observable } from 'rxjs';

import { PreferenceService, Preference, Scope } from '../core/preference.service';
import { PropertyService } from '../core/property.service';
import { Operator, OperatorUtil, FilterService, SearchFilter } from './filter.service';

class TestPreferenceService {
  getPreferenceForScope(scope: string, key?: string): Observable<Preference[]> {
    return observableOf([
    {
      id: 1,
      key: 'filter.nodes.test',
      scope: Scope.USER,
      source: null,
      user: 'testUser',
      value: '{"conditions":[],"name":"TestFilter","environments":[],"resultType":"Test","fulltextQuery":""}'
    }
  ]);
  }
}

describe('OperatorUtil', () => {

  describe('toString()', () => {
    it('should return associated string', () => {
      expect(OperatorUtil.toString(Operator.EQUALS)).toMatch('=');
      expect(OperatorUtil.toString(Operator.LESS_THAN)).toMatch('<');
      expect(OperatorUtil.toString(Operator.GREATER_THAN)).toMatch('>');
      expect(OperatorUtil.toString(Operator.LIKE)).toMatch('like');
    });
  });

  describe('toFilterString()', () => {
    it('should return associated filterstring', () => {
      expect(OperatorUtil.toFilterString(Operator.EQUALS)).toMatch('eq');
      expect(OperatorUtil.toFilterString(Operator.LESS_THAN)).toMatch('lt');
      expect(OperatorUtil.toFilterString(Operator.GREATER_THAN)).toMatch('gt');
      expect(OperatorUtil.toFilterString(Operator.LIKE)).toMatch('lk');
    });
  });
});

describe('FilterService', () => {

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpModule],
      providers: [
        FilterService,
        PropertyService,
        {
          provide: PreferenceService,
          useClass: TestPreferenceService
        },
      ]
    });

  });

  describe('getFilters()', () => {

    it('should return array of filters from preference',  async(inject([FilterService], (service) => {
      let filters = [new SearchFilter('TestFilter', [], 'Test', '', [])];

      service.getFilters().subscribe(f => expect(f).toEqual(filters));
    })));
  });

  describe('filterToPreference()', () => {

    it('should return preference holding input filter',  async(inject([FilterService], (service) => {
      let filter = new SearchFilter('TestFilter', [], 'Test', '', []);
      let pref = service.filterToPreference(filter);

      expect(pref.scope).toEqual(Scope.USER);
      expect(pref.key).toMatch('filter.nodes.TestFilter');
      expect(pref.value).toEqual('{"conditions":[],"name":"TestFilter","environments":[],"resultType":"Test","fulltextQuery":""}');
    })));

    it('should return preference holding input filter',  async(inject([FilterService], (service) => {
      let pref = service.filterToPreference(undefined);

      expect(pref.scope).toEqual(Scope.USER);
      expect(pref.key).toMatch('filter.nodes.');
      expect(pref.value).toEqual(undefined);
    })));
  });
});
