/*
 * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
 * Ministerpräsidenten des Landes Schleswig-Holstein
 * Staatskanzlei
 * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
 *
 * Lizenziert unter der EUPL, Version 1.2 oder - sobald
 * diese von der Europäischen Kommission genehmigt wurden -
 * Folgeversionen der EUPL ("Lizenz");
 * Sie dürfen dieses Werk ausschließlich gemäß
 * dieser Lizenz nutzen.
 * Eine Kopie der Lizenz finden Sie hier:
 *
 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
 *
 * Sofern nicht durch anwendbare Rechtsvorschriften
 * gefordert oder in schriftlicher Form vereinbart, wird
 * die unter der Lizenz verbreitete Software "so wie sie
 * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
 * ausdrücklich oder stillschweigend - verbreitet.
 * Die sprachspezifischen Genehmigungen und Beschränkungen
 * unter der Lizenz sind dem Lizenztext zu entnehmen.
 */
import { StateResource, createStateResource } from '@alfa-client/tech-shared';
import { Mock, mock } from '@alfa-client/test-utils';
import { TestBed } from '@angular/core/testing';
import { singleCold, singleHot } from 'libs/tech-shared/test/marbles';
import { Observable } from 'rxjs';
import { createConfigurationResource } from '../../test/configuration';
import { ConfigurationResourceService } from './configuration-resource.service';
import { ConfigurationResource } from './configuration.model';
import { ConfigurationService } from './configuration.service';

describe('ConfigurationService', () => {
  let service: ConfigurationService;
  let configurationResourceService: Mock<ConfigurationResourceService>;

  beforeEach(() => {
    configurationResourceService = mock(ConfigurationResourceService);

    TestBed.configureTestingModule({
      providers: [ConfigurationService, { provide: ConfigurationResourceService, useValue: configurationResourceService }],
    });

    service = TestBed.inject(ConfigurationService);
  });

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

  describe('get', () => {
    const configurationResource: ConfigurationResource = createConfigurationResource();
    const configurationStateResource: StateResource<ConfigurationResource> = createStateResource(configurationResource);

    beforeEach(() => {
      configurationResourceService.get = jest.fn().mockReturnValue(singleHot(configurationStateResource));
    });
    it('should call resourceService', () => {
      service.get();

      expect(configurationResourceService.get).toHaveBeenCalled();
    });

    it('should return value', () => {
      const loadedConfigurationResource: Observable<StateResource<ConfigurationResource>> = service.get();

      expect(loadedConfigurationResource).toBeObservable(singleCold(configurationStateResource));
    });
  });
});