import { test } from 'qunit';
import moduleForAcceptance from 'vault/tests/helpers/module-for-acceptance';
import { supportedAuthBackends } from 'vault/helpers/supported-auth-backends';
import authForm from '../pages/components/auth-form';
import { create } from 'ember-cli-page-object';
import apiStub from 'vault/tests/helpers/noop-all-api-requests';

const component = create(authForm);

moduleForAcceptance('Acceptance | auth', {
  beforeEach() {
    this.server = apiStub({ usePassthrough: true });
    return authLogout();
  },
  afterEach() {
    this.server.shutdown();
  },
});

test('auth query params', function(assert) {
  const backends = supportedAuthBackends();
  visit('/vault/auth');
  andThen(() => {
    assert.equal(currentURL(), '/vault/auth?with=token');
  });
  backends.reverse().forEach(backend => {
    click(`[data-test-auth-method-link="${backend.type}"]`);
    andThen(() => {
      assert.equal(
        currentURL(),
        `/vault/auth?with=${backend.type}`,
        `has the correct URL for ${backend.type}`
      );
    });
  });
});

test('it clears token when changing selected auth method', function(assert) {
  visit('/vault/auth');
  andThen(() => {
    assert.equal(currentURL(), '/vault/auth?with=token');
  });
  component.token('token').tabs.filterBy('name', 'GitHub')[0].link();
  component.tabs.filterBy('name', 'Token')[0].link();
  andThen(() => {
    assert.equal(component.tokenValue, '', 'it clears the token value when toggling methods');
  });
});

test('it sends the right attributes when authenticating', function(assert) {
  let backends = supportedAuthBackends();
  visit('/vault/auth');
  backends.reverse().forEach(backend => {
    click(`[data-test-auth-method-link="${backend.type}"]`);
    if (backend.type === 'github') {
      component.token('token');
    }
    component.login();
    andThen(() => {
      let lastRequest = this.server.passthroughRequests[this.server.passthroughRequests.length - 1];
      let body = JSON.parse(lastRequest.requestBody);
      if (backend.type === 'token') {
        assert.ok(
          Object.keys(lastRequest.requestHeaders).includes('X-Vault-Token'),
          'token uses vault token header'
        );
      } else if (backend.type === 'github') {
        assert.ok(Object.keys(body).includes('token'), 'GitHub includes token');
      } else {
        assert.ok(Object.keys(body).includes('password'), `${backend.type} includes password`);
      }
    });
  });
});
