jest.mock('@angular/router');

import { TestBed } from '@angular/core/testing';
import { HttpResponse } from '@angular/common/http';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { ActivatedRouteSnapshot, Router } from '@angular/router';
import { of } from 'rxjs';

import { IEPreguntaAbiertaRespuesta, EPreguntaAbiertaRespuesta } from '../e-pregunta-abierta-respuesta.model';
import { EPreguntaAbiertaRespuestaService } from '../service/e-pregunta-abierta-respuesta.service';

import { EPreguntaAbiertaRespuestaRoutingResolveService } from './e-pregunta-abierta-respuesta-routing-resolve.service';

describe('Service Tests', () => {
  describe('EPreguntaAbiertaRespuesta routing resolve service', () => {
    let mockRouter: Router;
    let mockActivatedRouteSnapshot: ActivatedRouteSnapshot;
    let routingResolveService: EPreguntaAbiertaRespuestaRoutingResolveService;
    let service: EPreguntaAbiertaRespuestaService;
    let resultEPreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta | undefined;

    beforeEach(() => {
      TestBed.configureTestingModule({
        imports: [HttpClientTestingModule],
        providers: [Router, ActivatedRouteSnapshot],
      });
      mockRouter = TestBed.inject(Router);
      mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot);
      routingResolveService = TestBed.inject(EPreguntaAbiertaRespuestaRoutingResolveService);
      service = TestBed.inject(EPreguntaAbiertaRespuestaService);
      resultEPreguntaAbiertaRespuesta = undefined;
    });

    describe('resolve', () => {
      it('should return IEPreguntaAbiertaRespuesta returned by find', () => {
        // GIVEN
        service.find = jest.fn(id => of(new HttpResponse({ body: { id } })));
        mockActivatedRouteSnapshot.params = { id: 123 };

        // WHEN
        routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => {
          resultEPreguntaAbiertaRespuesta = result;
        });

        // THEN
        expect(service.find).toBeCalledWith(123);
        expect(resultEPreguntaAbiertaRespuesta).toEqual({ id: 123 });
      });

      it('should return new IEPreguntaAbiertaRespuesta if id is not provided', () => {
        // GIVEN
        service.find = jest.fn();
        mockActivatedRouteSnapshot.params = {};

        // WHEN
        routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => {
          resultEPreguntaAbiertaRespuesta = result;
        });

        // THEN
        expect(service.find).not.toBeCalled();
        expect(resultEPreguntaAbiertaRespuesta).toEqual(new EPreguntaAbiertaRespuesta());
      });

      it('should route to 404 page if data not found in server', () => {
        // GIVEN
        jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as EPreguntaAbiertaRespuesta })));
        mockActivatedRouteSnapshot.params = { id: 123 };

        // WHEN
        routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => {
          resultEPreguntaAbiertaRespuesta = result;
        });

        // THEN
        expect(service.find).toBeCalledWith(123);
        expect(resultEPreguntaAbiertaRespuesta).toEqual(undefined);
        expect(mockRouter.navigate).toHaveBeenCalledWith(['404']);
      });
    });
  });
});
