( function ( mw ) {
	QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment() );

	QUnit.asyncTest( 'Basic functionality', function ( assert ) {
		var api, d1, d2, d3;
		QUnit.expect( 3 );

		api = new mw.Api();

		d1 = api.get( {} )
			.done( function ( data ) {
				assert.deepEqual( data, [], 'If request succeeds without errors, resolve deferred' );
			} );

		d2 = api.get( {
			action: 'doesntexist'
		} )
			.fail( function ( errorCode ) {
				assert.equal( errorCode, 'unknown_action', 'API error (e.g. "unknown_action") should reject the deferred' );
			} );

		d3 = api.post( {} )
			.done( function ( data ) {
				assert.deepEqual( data, [], 'Simple POST request' );
			} );

		// After all are completed, continue the test suite.
		QUnit.whenPromisesComplete( d1, d2, d3 ).always( function () {
			QUnit.start();
		} );
	} );

	QUnit.asyncTest( 'Deprecated callback methods', function ( assert ) {
		var api, d1, d2, d3;
		QUnit.expect( 3 );

		api = new mw.Api();

		d1 = api.get( {}, function () {
			assert.ok( true, 'Function argument treated as success callback.' );
		} );

		d2 = api.get( {}, {
			ok: function () {
				assert.ok( true, '"ok" property treated as success callback.' );
			}
		} );

		d3 = api.get( {
			action: 'doesntexist'
		}, {
			err: function () {
				assert.ok( true, '"err" property treated as error callback.' );
			}
		} );

		QUnit.whenPromisesComplete( d1, d2, d3 ).always( function () {
			QUnit.start();
		} );
	} );
}( mediaWiki ) );
