'use strict';

describe('Admin > Settings', function () {
  this.timeout(480000);

  before(async function () {
    let success = false;
    $.ajax({
      url: `${location.protocol}//admin:changeme@${location.hostname}:${location.port}/admin/`,
      type: 'GET',
      success: () => success = true,
    });
    await helper.waitForPromise(() => success === true);
  });

  beforeEach(async function () {
    helper.newAdmin('settings');
    // needed, because the load event is fired to early
    await helper.waitForPromise(
        () => helper.admin$ && helper.admin$('.settings').val().length > 0, 5000);
  });

  it('Are Settings visible, populated, does save work', async function () {
    // save old value
    const settings = helper.admin$('.settings').val();
    const settingsLength = settings.length;

    // set new value
    helper.admin$('.settings').val((_, text) => `/* test */\n${text}`);
    await helper.waitForPromise(
        () => settingsLength + 11 === helper.admin$('.settings').val().length, 5000);

    // saves
    helper.admin$('#saveSettings').click();
    await helper.waitForPromise(() => helper.admin$('#response').is(':visible'), 5000);

    // new value for settings.json should now be saved
    // reset it to the old value
    helper.newAdmin('settings');
    await helper.waitForPromise(
        () => helper.admin$ && helper.admin$('.settings').val().length > 0, 20000);

    // replace the test value with a line break
    helper.admin$('.settings').val((_, text) => text.replace('/* test */\n', ''));
    await helper.waitForPromise(() => settingsLength === helper.admin$('.settings').val().length);

    helper.admin$('#saveSettings').click(); // saves
    await helper.waitForPromise(() => helper.admin$('#response').is(':visible'));

    // settings should have the old value
    helper.newAdmin('settings');
    await helper.waitForPromise(
        () => helper.admin$ && helper.admin$('.settings').val().length > 0, 36000);
    expect(settings).to.be(helper.admin$('.settings').val());
  });

  function timeout(ms) {
    return new Promise((resolve) => setTimeout(resolve, ms));
  }

  it('restart works', async function () {
    // restarts
    helper.admin$('#restartEtherpad').click();

    // Hacky...  Other suggestions welcome..
    await timeout(200000);
    let success = false;
    $.ajax({
      url: `${location.protocol}//admin:changeme@${location.hostname}:${location.port}/admin`,
      type: 'GET',
      success: () => success = true,
    });
    await helper.waitForPromise(() => success === true);
  });
});

'use strict';

describe('Admin > Settings', function () {
  this.timeout(480000);

  before(async function () {
    let success = false;
    $.ajax({
      url: `${location.protocol}//admin:changeme@${location.hostname}:${location.port}/admin/`,
      type: 'GET',
      success: () => success = true,
    });
    await helper.waitForPromise(() => success === true);
  });

  beforeEach(async function () {
    helper.newAdmin('settings');
    // needed, because the load event is fired to early
    await helper.waitForPromise(
        () => helper.admin$ && helper.admin$('.settings').val().length > 0, 5000);
  });

  it('Are Settings visible, populated, does save work', async function () {
    // save old value
    const settings = helper.admin$('.settings').val();
    const settingsLength = settings.length;

    // set new value
    helper.admin$('.settings').val((_, text) => `/* test */\n${text}`);
    await helper.waitForPromise(
        () => settingsLength + 11 === helper.admin$('.settings').val().length, 5000);

    // saves
    helper.admin$('#saveSettings').click();
    await helper.waitForPromise(() => helper.admin$('#response').is(':visible'), 5000);

    // new value for settings.json should now be saved
    // reset it to the old value
    helper.newAdmin('settings');
    await helper.waitForPromise(
        () => helper.admin$ && helper.admin$('.settings').val().length > 0, 20000);

    // replace the test value with a line break
    helper.admin$('.settings').val((_, text) => text.replace('/* test */\n', ''));
    await helper.waitForPromise(() => settingsLength === helper.admin$('.settings').val().length);

    helper.admin$('#saveSettings').click(); // saves
    await helper.waitForPromise(() => helper.admin$('#response').is(':visible'));

    // settings should have the old value
    helper.newAdmin('settings');
    await helper.waitForPromise(
        () => helper.admin$ && helper.admin$('.settings').val().length > 0, 36000);
    expect(settings).to.be(helper.admin$('.settings').val());
  });

  it('restart works', async function () {
    this.timeout(60000);
    const getUptime = async () => {
      try {
        const {httpUptime} = await $.ajax({
          url: new URL('/stats', window.location.href),
          method: 'GET',
          dataType: 'json',
          timeout: 450, // Slightly less than the waitForPromise() interval.
        });
        return httpUptime;
      } catch (err) {
        return null;
      }
    };
    await helper.waitForPromise(async () => {
      const uptime = await getUptime();
      return uptime != null && uptime > 0;
    }, 1000, 500);
    const clickTime = Date.now();
    helper.admin$('#restartEtherpad').click();
    await helper.waitForPromise(async () => {
      const uptime = await getUptime();
      return uptime != null && Date.now() - uptime >= clickTime;
    }, 60000, 500);
  });
});

Improve `/admin/settings` restart test