/* global wp, JSON */
( function( QUnit ) {
	var originalRootUrl = window.wpApiSettings.root;

	var expectedHeaders = {
		'X-WP-Nonce': 'not_a_real_nonce',
		'Accept': 'application/json, */*;q=0.1'
	};

	QUnit.module( 'wp-api-request', {
		afterEach: function() {
			window.wpApiSettings.root = originalRootUrl;
		}
	} );

	QUnit.test( 'does not mutate original object', function( assert ) {
		var settingsOriginal = {
			url: 'aaaaa',
			path: 'wp/v2/posts',
			headers: {
				'Header-Name': 'value'
			},
			data: {
				orderby: 'something'
			}
		};

		var settings = wp.apiRequest.buildAjaxOptions( settingsOriginal );

		assert.notStrictEqual( settings, settingsOriginal );
		assert.notStrictEqual( settings.headers, settingsOriginal.headers );
		assert.strictEqual( settings.data, settingsOriginal.data );

		assert.deepEqual( settings, {
			url: 'http://localhost/wp-json/wp/v2/posts',
			headers: {
				'X-WP-Nonce': 'not_a_real_nonce',
				'Accept': 'application/json, */*;q=0.1',
				'Header-Name': 'value'
			},
			data: {
				orderby: 'something'
			}
		} );

		assert.deepEqual( settingsOriginal, {
			url: 'aaaaa',
			path: 'wp/v2/posts',
			headers: {
				'Header-Name': 'value'
			},
			data: {
				orderby: 'something'
			}
		} );
	} );

	QUnit.test( 'does not add nonce header if already present', function( assert ) {
		[ 'X-WP-Nonce', 'x-wp-nonce', 'X-WP-NONCE' ].forEach( function( headerName ) {
			var nonceHeader = {};
			nonceHeader[ headerName ] = 'still_not_a_real_nonce';

			var settingsOriginal = {
				url: 'aaaa',
				headers: JSON.parse( JSON.stringify( nonceHeader ) )
			};

			var settings = wp.apiRequest.buildAjaxOptions( settingsOriginal );

			assert.notStrictEqual( settings, settingsOriginal );

			var expected = {
				Accept: 'application/json, */*;q=0.1'
			};
			expected[ headerName ] = nonceHeader[ headerName ];

			assert.deepEqual( settings, {
				url: 'aaaa',
				headers: expected
			} );
		} );
	} );

	QUnit.test( 'does not add nonce header if ?_wpnonce=... present', function( assert ) {
		var settingsOriginal = {
			url: 'aaaa',
			data: {
				_wpnonce: 'definitely_not_a_real_nonce'
			}
		};

		var settings = wp.apiRequest.buildAjaxOptions( settingsOriginal );

		assert.notStrictEqual( settings, settingsOriginal );

		assert.deepEqual( settings, {
			url: 'aaaa',
			headers: {
				'Accept': 'application/json, */*;q=0.1'
			},
			data: {
				_wpnonce: 'definitely_not_a_real_nonce'
			}
		} );
	} );

	QUnit.test( 'does not add accept header if already present', function( assert ) {
		var settingsOriginal = {
			url: 'aaaa',
			headers: {
				'Accept': 'text/xml'
			}
		};

		var settings = wp.apiRequest.buildAjaxOptions( settingsOriginal );

		assert.strictEqual( settingsOriginal.headers.Accept, settings.headers.Accept );
	} );

	QUnit.test( 'accepts namespace and endpoint', function( assert ) {
		assert.deepEqual( wp.apiRequest.buildAjaxOptions( {
			namespace: 'wp/v2',
			endpoint: 'posts'
		} ), {
			url: 'http://localhost/wp-json/wp/v2/posts',
			headers: expectedHeaders
		} );
	} );

	QUnit.test( 'accepts namespace and endpoint with slashes', function( assert ) {
		assert.deepEqual( wp.apiRequest.buildAjaxOptions( {
			namespace: '/wp/v2/',
			endpoint: '/posts'
		} ), {
			url: 'http://localhost/wp-json/wp/v2/posts',
			headers: expectedHeaders
		} );
	} );

	QUnit.test( 'accepts namespace and empty endpoint', function( assert ) {
		assert.deepEqual( wp.apiRequest.buildAjaxOptions( {
			namespace: 'wp/v2',
			endpoint: ''
		} ), {
			url: 'http://localhost/wp-json/wp/v2',
			headers: expectedHeaders
		} );
	} );

	QUnit.test( 'accepts empty namespace and empty endpoint', function( assert ) {
		assert.deepEqual( wp.apiRequest.buildAjaxOptions( {
			namespace: '',
			endpoint: ''
		} ), {
			url: 'http://localhost/wp-json/',
			headers: expectedHeaders
		} );
	} );

	QUnit.test(
		'accepts namespace and endpoint with slashes (plain permalinks)',
		function( assert ) {
			window.wpApiSettings.root = 'http://localhost/index.php?rest_route=/';
			assert.deepEqual( wp.apiRequest.buildAjaxOptions( {
				namespace: '/wp/v2/',
				endpoint: '/posts?orderby=title'
			} ), {
				url: 'http://localhost/index.php?rest_route=/wp/v2/posts&orderby=title',
				headers: expectedHeaders
			} );
		}
	);

	QUnit.test(
		'accepts empty namespace and empty endpoint (plain permalinks)',
		function( assert ) {
			window.wpApiSettings.root = 'http://localhost/index.php?rest_route=/';
			assert.deepEqual( wp.apiRequest.buildAjaxOptions( {
				namespace: '',
				endpoint: ''
			} ), {
				url: 'http://localhost/index.php?rest_route=/',
				headers: expectedHeaders
			} );
		}
	);
} )( window.QUnit );