/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

describe('urlutil', function () {
    var urlutil = require('cordova/urlutil');
    if (typeof process !== 'undefined') {
        // Tests don't work under jsdom.
        return;
    }

    it('Test#001 : can handle absolute URLs', function () {
        expect(urlutil.makeAbsolute('http://www.foo.com')).toBe('http://www.foo.com/');
        expect(urlutil.makeAbsolute('http://www.foo.com?foo#bar')).toBe('http://www.foo.com/?foo#bar');
        expect(urlutil.makeAbsolute('http://www.foo.com/%20hi')).toBe('http://www.foo.com/%20hi');
    });

    function testRootRelative (url) {
        var rootUrl = url.slice(0, 10) + url.slice(10).replace(/[?#].*/, '').replace(/\/.*/, '') + '/';
        expect(urlutil.makeAbsolute('/')).toBe(rootUrl);
        expect(urlutil.makeAbsolute('/foo?a#b')).toBe(rootUrl + 'foo?a#b');
        expect(urlutil.makeAbsolute('/foo/b%20ar')).toBe(rootUrl + 'foo/b%20ar');
    }
    it('Test#002 : can handle root-relative URLs', function () {
        testRootRelative(window.location.href);
    });

    it('Test#003 : can handle relative URLs', function () {
        var rootUrl = window.location.href.replace(/[?#].*/, '').replace(/[^\/]*$/, ''); // eslint-disable-line no-useless-escape
        expect(urlutil.makeAbsolute('foo?a#b')).toBe(rootUrl + 'foo?a#b');
        expect(urlutil.makeAbsolute('foo/b%20ar')).toBe(rootUrl + 'foo/b%20ar');
    });

    it('Test#004 : can handle relative URLs with base tags', function () {
        var rootUrl = 'http://base.com/esab/';
        var baseTag = document.createElement('base');
        baseTag.href = rootUrl;
        document.head.appendChild(baseTag);
        try {
            expect(urlutil.makeAbsolute('foo?a#b')).toBe(rootUrl + 'foo?a#b');
            expect(urlutil.makeAbsolute('foo/b%20ar')).toBe(rootUrl + 'foo/b%20ar');
            testRootRelative(rootUrl);
        } finally {
            document.head.removeChild(baseTag);
        }
    });

    it('Test#005 : can handle scheme-relative URLs', function () {
        var rootUrl = window.location.href.replace(/:.*/, '');
        expect(urlutil.makeAbsolute('//www.foo.com/baz%20?foo#bar')).toBe(rootUrl + '://www.foo.com/baz%20?foo#bar');
    });

});
