// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {assert} from 'chai';
import sinon from 'sinon';
import loadGapi, {fetchGapiEmail, getSigninInstance} from './gapi-loader.js';

describe.skip('gapi-loader', () => {
  let signinImpl;
  beforeEach(() => {
    window.CS_env = {gapi_client_id: 'rutabaga'};
    signinImpl = {
      init: sinon.stub(),
      getUserProfileAsync: () => (
        Promise.resolve({
          getEmail: sinon.stub().returns('rutabaga@google.com'),
        })
      ),
    };
    // Preload signinImpl with a fake for testing.
    getSigninInstance(signinImpl, true);
    delete window.__gapiLoadPromise;
  });

  afterEach(() => {
    delete window.CS_env;
  });

  describe('loadGapi()', () => {
    it('errors out if no client_id', () => {
      window.CS_env.gapi_client_id = undefined;
      assert.throws(() => loadGapi());
    });

    it('returns the same promise when called multiple times', () => {
      const callOne = loadGapi();
      const callTwo = loadGapi();

      assert.strictEqual(callOne, callTwo);
      assert.strictEqual(callOne, window.__gapiLoadPromise);
      assert.strictEqual(callTwo, window.__gapiLoadPromise);
      assert.instanceOf(callOne, Promise);
    });

    it('calls init and returns the current email if any', async () => {
      const response = await loadGapi();
      sinon.assert.calledWith(signinImpl.init, window.CS_env.gapi_client_id,
          ['client'], ['https://www.googleapis.com/auth/buganizer']);
      assert.equal(response, 'rutabaga@google.com');
    });
  });

  describe('fetchGapiEmail()', () => {
    it('returns a profile for allowed domains', async () => {
      getSigninInstance({
        getUserProfileAsync: () => Promise.resolve({
          getEmail: sinon.stub().returns('rutabaga@google.com'),
        }),
      }, true);
      assert.deepEqual(await fetchGapiEmail(), 'rutabaga@google.com');
    });

    it('returns nothing for non-allowed domains', async () => {
      getSigninInstance({
        getUserProfileAsync: () => Promise.resolve({
          getEmail: sinon.stub().returns('rutabaga@rutabaga.com'),
        }),
      }, true);
      assert.deepEqual(await fetchGapiEmail(), null);
    });
  });
});
