QUnit.module( 'ext.echo.dm - SourcePagesModel', () => {
	// Mock partial API response we feed into the model
	const sources = {
		local: {
			pages: [
				{
					ns: 2,
					title: 'User:Admin',
					unprefixed: 'Admin',
					pages: [
						'User:Admin',
						'User talk:Admin',
						null
					],
					count: 24
				},
				{
					ns: 2,
					title: 'User:RandomUser',
					unprefixed: 'RandomUser',
					pages: [
						'User:RandomUser',
						'User talk:RandomUser'
					],
					count: 6
				},
				{
					ns: 0,
					title: 'Moai',
					unprefixed: 'Moai',
					pages: [
						'Moai',
						'Talk:Moai'
					],
					count: 3
				}
			],
			totalCount: 33,
			source: {
				title: 'LocalWiki',
				url: 'http://dev.wiki.local.wmftest.net:8080/w/api.php',
				base: 'http://dev.wiki.local.wmftest.net:8080/wiki/$1'
			}
		},
		hewiki: {
			pages: [
				{
					ns: 2,
					title: 'Foo',
					unprefixed: 'Foo',
					pages: [
						'Foo',
						'Talk:Foo',
						null
					],
					count: 10
				},
				{
					ns: 0,
					title: 'User:Bar',
					unprefixed: 'Bar',
					pages: [
						'User:Bar',
						'User talk:Bar'
					],
					count: 5
				}
			],
			totalCount: 15,
			source: {
				title: 'Hebrew Wikipedia',
				url: 'http://he.wiki.local.wmftest.net:8080/w/api.php',
				base: 'http://he.wiki.local.wmftest.net:8080/wiki/$1'
			}
		}
	};

	QUnit.test( 'Creating source-page map', ( assert ) => {
		const model = new mw.echo.dm.SourcePagesModel();

		model.setAllSources( sources );

		assert.strictEqual(
			model.getCurrentSource(),
			'local',
			'Default source is local'
		);
		assert.strictEqual(
			model.getCurrentPage(),
			null,
			'Default page is null'
		);
		assert.deepEqual(
			model.getSourcesArray(),
			[ 'local', 'hewiki' ],
			'Source array includes all sources'
		);
		assert.strictEqual(
			model.getSourceTitle( 'hewiki' ),
			'Hebrew Wikipedia',
			'Source title'
		);
		assert.strictEqual(
			model.getSourceTotalCount( 'hewiki' ),
			15,
			'Source total count'
		);
		assert.deepEqual(
			model.getSourcePages( 'local' ),
			{
				Moai: {
					count: 3,
					ns: 0,
					pages: [
						'Moai',
						'Talk:Moai'
					],
					title: 'Moai',
					unprefixed: 'Moai'
				},
				'User:Admin': {
					count: 24,
					ns: 2,
					pages: [
						'User:Admin',
						'User talk:Admin',
						null
					],
					title: 'User:Admin',
					unprefixed: 'Admin'
				},
				'User:RandomUser': {
					count: 6,
					ns: 2,
					pages: [
						'User:RandomUser',
						'User talk:RandomUser'
					],
					title: 'User:RandomUser',
					unprefixed: 'RandomUser'
				}
			},
			'Outputting source pages'
		);
		assert.deepEqual(
			model.getGroupedPagesForTitle( 'local', 'User:Admin' ),
			[
				'User:Admin',
				'User talk:Admin',
				null
			],
			'Grouped pages per title'
		);

		// Change source
		model.setCurrentSourcePage( 'hewiki', 'User:Bar' );

		assert.strictEqual(
			model.getCurrentSource(),
			'hewiki',
			'Source changed successfully'
		);
		assert.strictEqual(
			model.getCurrentPage(),
			'User:Bar',
			'Page changed successfully'
		);

	} );
} );
