/**
 * @license
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import '../test/common-test-setup-karma.js';
import {
  getBaseUrl,
  getDocsBaseUrl,
  _testOnly_clearDocsBaseUrlCache,
  encodeURL, singleDecodeURL,
} from './url-util.js';

suite('url-util tests', () => {
  suite('getBaseUrl tests', () => {
    let originialCanonicalPath;

    suiteSetup(() => {
      originialCanonicalPath = window.CANONICAL_PATH;
      window.CANONICAL_PATH = '/r';
    });

    suiteTeardown(() => {
      window.CANONICAL_PATH = originialCanonicalPath;
    });

    test('getBaseUrl', () => {
      assert.deepEqual(getBaseUrl(), '/r');
    });
  });

  suite('getDocsBaseUrl tests', () => {
    setup(() => {
      _testOnly_clearDocsBaseUrlCache();
    });

    test('null config', async () => {
      const mockRestApi = {
        probePath: sinon.stub().returns(Promise.resolve(true)),
      };
      const docsBaseUrl = await getDocsBaseUrl(null, mockRestApi);
      assert.isTrue(
          mockRestApi.probePath.calledWith('/Documentation/index.html'));
      assert.equal(docsBaseUrl, '/Documentation');
    });

    test('no doc config', async () => {
      const mockRestApi = {
        probePath: sinon.stub().returns(Promise.resolve(true)),
      };
      const config = {gerrit: {}};
      const docsBaseUrl = await getDocsBaseUrl(config, mockRestApi);
      assert.isTrue(
          mockRestApi.probePath.calledWith('/Documentation/index.html'));
      assert.equal(docsBaseUrl, '/Documentation');
    });

    test('has doc config', async () => {
      const mockRestApi = {
        probePath: sinon.stub().returns(Promise.resolve(true)),
      };
      const config = {gerrit: {doc_url: 'foobar'}};
      const docsBaseUrl = await getDocsBaseUrl(config, mockRestApi);
      assert.isFalse(mockRestApi.probePath.called);
      assert.equal(docsBaseUrl, 'foobar');
    });

    test('no probe', async () => {
      const mockRestApi = {
        probePath: sinon.stub().returns(Promise.resolve(false)),
      };
      const docsBaseUrl = await getDocsBaseUrl(null, mockRestApi);
      assert.isTrue(
          mockRestApi.probePath.calledWith('/Documentation/index.html'));
      assert.isNotOk(docsBaseUrl);
    });
  });

  suite('url encoding and decoding tests', () => {
    suite('encodeURL', () => {
      test('double encodes', () => {
        assert.equal(encodeURL('abc?123'), 'abc%253F123');
        assert.equal(encodeURL('def/ghi'), 'def%252Fghi');
        assert.equal(encodeURL('jkl'), 'jkl');
        assert.equal(encodeURL(''), '');
      });

      test('does not convert colons', () => {
        assert.equal(encodeURL('mno:pqr'), 'mno:pqr');
      });

      test('converts spaces to +', () => {
        assert.equal(encodeURL('words with spaces'), 'words+with+spaces');
      });

      test('does not convert slashes when configured', () => {
        assert.equal(encodeURL('stu/vwx', true), 'stu/vwx');
      });

      test('does not convert slashes when configured', () => {
        assert.equal(encodeURL('stu/vwx', true), 'stu/vwx');
      });
    });

    suite('singleDecodeUrl', () => {
      test('single decodes', () => {
        assert.equal(singleDecodeURL('abc%3Fdef'), 'abc?def');
      });

      test('converts + to space', () => {
        assert.equal(singleDecodeURL('ghi+jkl'), 'ghi jkl');
      });
    });
  });
});
