// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

part of gapi_mocks;

// JS mock of a gapi.auth2, with a successfully identified user
String auth2InitSuccess(GoogleSignInUserData userData) => testIife('''
${gapi()}

var mockUser = ${googleUser(userData)};

function GapiAuth2() {}
GapiAuth2.prototype.init = function (initOptions) {
  return {
    then: (onSuccess, onError) => {
      window.setTimeout(() => {
        onSuccess(window.gapi.auth2);
      }, 30);
    },
    currentUser: {
      listen: (cb) => {
        window.setTimeout(() => {
          cb(mockUser);
        }, 30);
      }
    }
  }
};

GapiAuth2.prototype.getAuthInstance = function () {
  return {
    signIn: () => {
      return new Promise((resolve, reject) => {
        window.setTimeout(() => {
          resolve(mockUser);
        }, 30);
      });
    },
    currentUser: {
      get: () => mockUser,
    },
  }
};

window.gapi.auth2 = new GapiAuth2();
''');

String auth2InitError() => testIife('''
${gapi()}

function GapiAuth2() {}
GapiAuth2.prototype.init = function (initOptions) {
  return {
    then: (onSuccess, onError) => {
      window.setTimeout(() => {
        onError({
          error: 'idpiframe_initialization_failed',
          details: 'This error was raised from a test.',
        });
      }, 30);
    }
  }
};

window.gapi.auth2 = new GapiAuth2();
''');

String auth2SignInError([String error = 'popup_closed_by_user']) => testIife('''
${gapi()}

var mockUser = null;

function GapiAuth2() {}
GapiAuth2.prototype.init = function (initOptions) {
  return {
    then: (onSuccess, onError) => {
      window.setTimeout(() => {
        onSuccess(window.gapi.auth2);
      }, 30);
    },
    currentUser: {
      listen: (cb) => {
        window.setTimeout(() => {
          cb(mockUser);
        }, 30);
      }
    }
  }
};

GapiAuth2.prototype.getAuthInstance = function () {
  return {
    signIn: () => {
      return new Promise((resolve, reject) => {
        window.setTimeout(() => {
          reject({
            error: '$error'
          });
        }, 30);
      });
    },
  }
};

window.gapi.auth2 = new GapiAuth2();
''');
