import { HttpClientModule } from '@angular/common/http';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { TranslateModule } from '@ngx-translate/core';
import { ApplicationConfigService } from 'app/core/config/application-config.service';
import { LocalStorageService, SessionStorageService } from 'ngx-webstorage';
import { ExerciseService } from './exercise.service';

describe('ExerciseService', () => {
  let service: ExerciseService;
  let httpMock: HttpTestingController;
  let applicationConfigService: ApplicationConfigService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule, HttpClientModule, TranslateModule.forRoot(), RouterTestingModule],
      declarations: [],
      providers: [ApplicationConfigService, LocalStorageService, SessionStorageService],
    });

    applicationConfigService = TestBed.inject(ApplicationConfigService);
    service = TestBed.inject(ExerciseService);
    httpMock = TestBed.inject(HttpTestingController);
  });

  it('should inject', () => {
    expect(service).toBeTruthy();
  });

  it('test Caching', () => {
    let isInvoked443 = 0;
    let isInvoked444 = 0;

    service.loadExercise('443').subscribe(() => {
      isInvoked443++;
    });
    service.loadExercise('444').subscribe(() => {
      isInvoked444++;
    });
    expect(isInvoked443).toEqual(0); // still waiting for response
    expect(isInvoked444).toEqual(0); // still waiting for response
    const testRequest443 = httpMock.expectOne({
      method: 'GET',
      url: applicationConfigService.getEndpointFor('api/exercise/443'),
    });
    const testRequest444 = httpMock.expectOne({
      method: 'GET',
      url: applicationConfigService.getEndpointFor('api/exercise/444'),
    });

    testRequest443.flush({
      kaese: 'kaese',
    });
    testRequest444.flush({
      kaese: 'kaese',
    });
    expect(isInvoked443).toEqual(1);
    expect(isInvoked444).toEqual(1);

    service.loadExercise('444').subscribe(() => {
      isInvoked444++;
    });
    expect(isInvoked444).toEqual(3); // result was returned immediately from cache
    expect(isInvoked443).toEqual(2);
    httpMock.expectNone({});
  });
});