Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
//<nowiki>
/*global mediaWiki, QUnit*/
(function ($, mw, simpleMockAjax, bs) {
"use strict";

function editManyTest (name, expected, duration) {
	var assertionCount = 0, title, titles = [], queries = {}, titleData = {};

	function getData (title, result) {
		var old = (title.charAt(0) === '-') ? '' : title + ' (alt)', edit, queries = {}, key1, val1, key2, val2a, val2b;
		edit = {text: title + ' (neu)'};
		key1 = 'action=query&prop=info%7Crevisions&meta=tokens&titles=' + encodeURIComponent(title) +
			'&rvprop=timestamp%7Ccontent&rvslots=main&rvlimit=1&curtimestamp=true&assert=user&format=json&formatversion=2';
		val1 = old ?
			'{"curtimestamp":"2001-02-02T14:00:00Z","query":' +
				'{"pages":[{"pageid":42,"revisions":[{"timestamp":"2000-01-01T12:00:00Z","slots":{"main":{"content":"' +
				old.replace(/"/g, '\\"') + '"}}}]}],"tokens":{"csrftoken":"123+\\\\"}}}' :
			'{"curtimestamp":"2001-02-02T14:00:00Z","query":' +
				'{"pages":[{"missing":true}],"tokens":{"csrftoken":"123+\\\\"}}}';

		key2 = $.param({action: 'edit', title: title, text: edit.text,
			summary: result === 'EDIT' ? title + ' (Zusammenfassung)' : 'Zusammenfassung',
			basetimestamp: old ? '2000-01-01T12:00:00Z' : '2001-02-02T14:00:00Z',
				starttimestamp: '2001-02-02T14:00:00Z', token: '123+\\', format: 'json', formatversion: 2});
		key2 += result === 'EDIT' ? '&notminor=' : '&minor=';
		key2 += '&maxlag=1';
		val2a = '{"error":{"code":"maxlag"}}';
		val2b = '{"edit":{"result":"Success"}}';
		switch (result || '') {
		case '':
			return {
				assertions: 0, queries: {}
			};
		case 'abort':
			queries[key1] = val1;
			return {
				assertions: 3, queries: queries, abort: true, old: old, edit: edit, error: bs.error.ABORT
			};
		case 'logout':
			queries[key1] = '{"error":{"code":"assertuserfailed"}}';
			return {
				assertions: 1, queries: queries, old: old, edit: edit, error: bs.error.LOSTLOGIN
			};
		case 'conflict':
			queries[key1] = val1;
			queries[key2] = '{"error":{"code":"editconflict"}}';
			return {
				assertions: 5, queries: queries, old: old, edit: edit, error: bs.error.EDITCONFLICT
			};
		case '!verify':
			queries[key1] = val1;
			return {
				assertions: 5, queries: queries, old: old, edit: edit, verify: false, error: bs.error.NOTVERIFIED
			};
		case 'lag':
			queries[key1] = val1;
			queries[key2] = [val2a, val2b];
			return {
				assertions: 7, queries: queries, old: old, edit: edit, summary: 'Zusammenfassung'
			};
		case 'maxlag':
			queries[key1] = val1;
			queries[key2] = [val2a, val2a];
			return {
				assertions: 5, queries: queries, old: old, edit: edit, error: bs.error.MAXLAG
			};
		case 'edit':
			queries[key1] = val1;
			queries[key2] = val2b;
			return {
				assertions: 7, queries: queries, old: old, edit: edit, summary: 'Zusammenfassung'
			};
		case 'EDIT':
			queries[key1] = val1;
			queries[key2] = val2b;
			edit.summary = title + ' (Zusammenfassung)';
			edit.minor = false;
			return {
				assertions: 7, queries: queries, old: old, edit: edit, summary: title + ' (Zusammenfassung)'
			};
		case '!edit':
			queries[key1] = val1;
			return {
				assertions: 3, queries: queries, old: old, edit: false, error: bs.error.NOEDIT
			};
		case '!EDIT':
			queries[key1] = val1;
			edit.text = old;
			return {
				assertions: 3, queries: queries, old: old, edit: edit, error: bs.error.NOEDIT
			};
		}
	}

	for (title in expected) {
		if (expected.hasOwnProperty(title)) {
			titles.push(title);
			titleData[title] = getData(title, expected[title]);
			assertionCount += titleData[title].assertions;
			$.extend(queries, titleData[title].queries);
		}
	}
	assertionCount++;

	QUnit.test(name, function (assert) {
		var n = 0, abort = false, start, cont;
		function editF (title, old, callback) {
			assert.strictEqual(title, titles[n++], title + ' - korrekte Reihenfolge der Bearbeitungen');
			assert.strictEqual(old, titleData[title].old, title + ' - Text vor dem Bearbeiten');
			if (titleData[title].abort) {
				abort = true;
			}
			callback(titleData[title].edit);
		}
		function verifyF (title, old, data, yes, no) {
			assert.strictEqual(old, titleData[title].old, title + ' - alter Text beim Verifizieren');
			assert.strictEqual(data.text, title + ' (neu)', title + ' - neuer Text');
			if (titleData[title].verify === false) {
				no();
			} else {
				yes();
			}
		}
		function abortF () {
			return abort;
		}
		function maxlagF (n) {
			if (n >= 2) {
				return true;
			}
			return 1;
		}
		function onSuccess (title, data) {
			assert.strictEqual(data.newText, title + ' (neu)', title + ' - neuer Text nach Bearbeiten');
			assert.strictEqual(data.summary, titleData[title].summary, title + ' - Zusammenfassung');
			assert.strictEqual(titleData[title].error, undefined, title + ' sollte tatsächlich bearbeitet werden');
		}
		function onError (title, code) {
			assert.strictEqual(code, titleData[title].error, title + ' - Grund für Fehler');
		}
		function onFinish () {
			var dur = mw.now() - start;
			assert.ok(dur >= 1000 * duration,
				'Bearbeitungen dauerten so lange wie erwartet (' + Math.round(dur / 1000) + '/' + duration + ')');
			cont();
			simpleMockAjax(false, assert);
		}

		assert.expect(assertionCount);
		cont = assert.async();
		simpleMockAjax(true, assert).answerWith(queries);
		start = mw.now();
		bs.editMany(titles, 1000, {summary: 'Zusammenfassung', minor: true},
			editF, verifyF, abortF, maxlagF, onSuccess, onError, onFinish);
	});
}

QUnit.module('Bandersnatch');
editManyTest('Erfolgreiche Bearbeitungen an existierenden Artikeln', {A: 'edit', B: 'edit', C: 'edit'}, 2);
editManyTest('Komplexe Bearbeitungen', {A: 'EDIT', '-B': 'edit', '-C': 'EDIT'}, 2);
editManyTest('Probleme beim Bearbeiten', {A: '!EDIT', '-B': '!edit', '-C': '!verify', 'D': 'conflict'}, 0);
editManyTest('Server-Lag', {A: 'lag', B: 'maxlag', '-C': 'lag', D: 'lag', E: 'edit'}, 6);
editManyTest('Abbruch', {A: 'edit', B: 'abort', C: false, D: false}, 0);
editManyTest('Logout', {A: 'edit', B: 'logout', C: false, D: false}, 0);

})(jQuery, mediaWiki, mediaWiki.libs.qunit.simpleMockAjax, mediaWiki.libs.qunit.bandersnatch);
//</nowiki>