import {
  HttpClient,
  provideHttpClient,
  withInterceptorsFromDi,
} from '@angular/common/http';
import {
  HttpTestingController,
  provideHttpClientTesting,
} from '@angular/common/http/testing';
import { TestBed } from '@angular/core/testing';

import { RESTURLCombiner } from '../url-combiner/rest-url-combiner';
import { BrowserXSRFService } from './browser-xsrf.service';

describe(`BrowserXSRFService`, () => {
  let service: BrowserXSRFService;
  let httpClient: HttpClient;
  let httpTestingController: HttpTestingController;

  const endpointURL = new RESTURLCombiner('/security/csrf').toString();

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [],
      providers: [
        BrowserXSRFService,
        provideHttpClient(withInterceptorsFromDi()),
        provideHttpClientTesting(),
      ],
    });
    httpClient = TestBed.inject(HttpClient);
    httpTestingController = TestBed.inject(HttpTestingController);
    service = TestBed.inject(BrowserXSRFService);
  });

  describe(`initXSRFToken`, () => {
    it(`should perform a GET to the csrf endpoint`, (done: DoneFn) => {
      service.initXSRFToken(httpClient)();

      const req = httpTestingController.expectOne({
        url: endpointURL,
        method: 'GET',
      });

      req.flush({});
      httpTestingController.verify();
      expect().nothing();
      done();
    });

    describe(`when the GET succeeds`, () => {
      it(`should set tokenInitialized$ to true`, (done: DoneFn) => {
        service.initXSRFToken(httpClient)();

        const req = httpTestingController.expectOne(endpointURL);

        req.flush({});
        httpTestingController.verify();

        expect(service.tokenInitialized$.getValue()).toBeTrue();
        done();
      });
    });

  });
});
