// Copyright 2019 The Chromium Authors. All rights reserved.
// 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);
    });
  });
});
