Files
edx-platform/xmodule/js/spec/helper.js
Irtaza Akram c3e85426cb Autoformat Problem XBlock Source Files for Consistency (2/2) (#37487)
* fix: run prettier on problem block code

* fix: codeql issues
2025-12-08 20:01:42 +05:00

326 lines
10 KiB
JavaScript

/* global _ */
(function () {
"use strict";
var origAjax = $.ajax;
var stubbedYT = {
Player: function () {
var Player = jasmine.createSpyObj("YT.Player", [
"cueVideoById",
"getVideoEmbedCode",
"getCurrentTime",
"getPlayerState",
"getVolume",
"setVolume",
"loadVideoById",
"getAvailablePlaybackRates",
"playVideo",
"pauseVideo",
"seekTo",
"getDuration",
"setPlaybackRate",
"getAvailableQualityLevels",
"getPlaybackQuality",
"setPlaybackQuality",
"destroy",
]);
Player.getDuration.and.returnValue(60);
Player.getAvailablePlaybackRates.and.returnValue([0.5, 1.0, 1.5, 2.0]);
Player.getAvailableQualityLevels.and.returnValue(["highres", "hd1080", "hd720", "large", "medium", "small"]);
return Player;
},
PlayerState: {
UNSTARTED: -1,
ENDED: 0,
PLAYING: 1,
PAUSED: 2,
BUFFERING: 3,
CUED: 5,
},
ready: function (f) {
return f();
},
};
jasmine.YT = stubbedYT;
// Stub YouTube API.
window.YT = stubbedYT;
window.STATUS = window.YT.PlayerState;
window.onTouchBasedDevice = function () {
return navigator.userAgent.match(/iPhone|iPod|iPad/i);
};
jasmine.stubbedCaption = {
end: [3120, 6270, 8490, 21620, 24920, 25750, 27900, 34380, 35550, 40250],
start: [1180, 3120, 6270, 14910, 21620, 24920, 25750, 27900, 34380, 35550],
text: [
"MICHAEL CIMA: So let's do the first one here.",
"Vacancies, where do they come from?",
"Well, imagine a perfect crystal.",
"Now we know at any temperature other than absolute zero " + "there's enough",
"energy going around that some atoms will have more energy",
"than others, right?",
"There's a distribution.",
"If I plot energy here and number, these atoms in the crystal " + "will have a",
"distribution of energy.",
"And some will have quite a bit of energy, just for a moment.",
],
};
// Time waitsFor() should wait for before failing a test.
window.WAIT_TIMEOUT = 5000;
jasmine.getFixtures().fixturesPath += "fixtures";
jasmine.stubbedMetadata = {
"7tqY6eQzVhE": {
contentDetails: {
id: "7tqY6eQzVhE",
duration: "PT5M0S",
},
},
cogebirgzzM: {
contentDetails: {
id: "cogebirgzzM",
duration: "PT3M20S",
},
},
abcdefghijkl: {
contentDetails: {
id: "abcdefghijkl",
duration: "PT6M40S",
},
},
bogus: {
contentDetails: {
duration: "PT1M40S",
},
},
};
jasmine.fireEvent = function (el, eventName) {
var event;
if (document.createEvent) {
event = document.createEvent("HTMLEvents");
event.initEvent(eventName, true, true);
} else {
event = document.createEventObject();
event.eventType = eventName;
}
event.eventName = eventName;
if (document.createEvent) {
el.dispatchEvent(event);
} else {
el.fireEvent("on" + event.eventType, event);
}
};
jasmine.stubbedHtml5Speeds = ["0.75", "1.0", "1.25", "1.50", "2.0"];
jasmine.stubRequests = function () {
var spy = $.ajax;
if (!jasmine.isSpy($.ajax)) {
spy = spyOn($, "ajax");
}
return spy.and.callFake(function (settings) {
var match = settings.url.match(/googleapis\.com\/.+\/videos\/\?id=(.+)&part=contentDetails/),
status,
callCallback;
if (match) {
status = match[1].split("_");
if (status && status[0] === "status") {
callCallback = function (callback) {
callback.call(window, {}, status[1]);
};
return {
always: callCallback,
error: callCallback,
done: callCallback,
};
} else if (settings.success) {
return settings.success({
items: jasmine.stubbedMetadata[match[1]],
});
} else {
return {
always: function (callback) {
return callback.call(window, {}, "success");
},
done: function (callback) {
return callback.call(window, {}, "success");
},
};
}
} else if (settings.url.match(/transcript\/translation\/.+$/)) {
return settings.success(jasmine.stubbedCaption);
} else if (settings.url === "/transcript/available_translations") {
return settings.success(["uk", "de"]);
} else if (settings.url.match(/.+\/problem_get$/)) {
return settings.success({
html: window.readFixtures("problem_content.html"),
});
} else if (
settings.url === "/calculate" ||
settings.url.match(/.+\/goto_position$/) ||
settings.url.match(/event$/) ||
settings.url.match(/.+\/problem_(check|reset|show|save)$/)
) {
// Do nothing.
return {};
} else if (settings.url === "/save_user_state") {
return { success: true };
} else if (settings.url.match(/.+video-transcript.+$/)) {
if (settings.url.match(/.+&video_id=notAIGenerated/)) {
return settings.success(null);
}
if (settings.url.match(/.+&video_id=inProgress/)) {
return settings.success({
status: "In Progress",
});
}
if (settings.url.match(/.+&video_id=error/)) {
return settings.error();
}
return settings.success({
status: "Completed",
});
} else if (settings.url.match(/.+transcript-feedback.+$/) && settings.type === "GET") {
if (settings.url.match(/.+&video_id=error.+$/)) {
return settings.error();
}
if (settings.url.match(/.+&video_id=negative.+$/)) {
return settings.success({
value: false,
});
}
if (settings.url.match(/.+&video_id=none.+$/)) {
return settings.success(null);
}
return settings.success({
value: true,
});
} else if (settings.url.match(/.+transcript-feedback.+$/) && settings.type === "POST") {
return settings.success(settings.data.value !== null ? { value: settings.data.value } : null);
} else if (settings.url.match(new RegExp(jasmine.getFixtures().fixturesPath + ".+", "g"))) {
return origAjax(settings);
} else {
return $.ajax.and.callThrough();
}
});
};
// Stub jQuery.cookie module.
$.cookie = jasmine.createSpy("jQuery.cookie").and.returnValue("1.0");
// # Stub jQuery.qtip module.
$.fn.qtip = jasmine.createSpy("jQuery.qtip");
// Stub jQuery.scrollTo module.
$.fn.scrollTo = jasmine.createSpy("jQuery.scrollTo");
jasmine.initializePlayer = function (fixture, params) {
var state, metadata;
if (_.isString(fixture)) {
// `fixture` is a name of a fixture file.
loadFixtures(fixture);
} else {
// `fixture` is not a string. The first parameter is an object?
if (_.isObject(fixture)) {
// The first parameter contains attributes for the main video
// DIV element.
params = fixture;
}
// "video_all.html" is the default HTML template for HTML5 video.
loadFixtures("video_all.html");
}
// If `params` is an object, assign its properties as data attributes
// to the main video DIV element.
if (_.isObject(params)) {
metadata = _.extend($("#video_id").data("metadata"), params);
$("#video_id").data("metadata", metadata);
}
jasmine.stubRequests();
let runtime = jasmine.createSpyObj("TestRuntime", ["handlerUrl"]);
state = new window.Video(runtime, "#example");
state.resizer = (function () {
var methods = ["align", "alignByWidthOnly", "alignByHeightOnly", "setParams", "setMode", "setElement"],
obj = {},
delta = {
add: jasmine.createSpy().and.returnValue(obj),
substract: jasmine.createSpy().and.returnValue(obj),
reset: jasmine.createSpy().and.returnValue(obj),
};
$.each(methods, function (index, method) {
obj[method] = jasmine.createSpy(method).and.returnValue(obj);
});
obj.delta = delta;
return obj;
})();
// We return the `state` object of the newly initialized Video.
return state;
};
jasmine.initializeHLSPlayer = function (params) {
return jasmine.initializePlayer("video_hls.html", params);
};
jasmine.initializePlayerYouTube = function (params) {
// "video.html" contains HTML template for a YouTube video.
return jasmine.initializePlayer("video.html", params);
};
jasmine.DescribeInfo = function (description, specDefinitions) {
this.description = description;
this.specDefinitions = specDefinitions;
};
// This HTML Fullscreen API mock should use promises or async functions
// as the spec defines. We do not use them here because we're locked
// in to a version of jasmine that doesn't fully support async functions
// or promises. This mock also assumes that if non-vendor prefixed methods
// and properties are missing, then we'll use mozilla prefixed names since
// automated tests happen in firefox.
jasmine.mockFullscreenAPI = function () {
var fullscreenElement;
var vendorChangeEvent = "fullscreenEnabled" in document ? "fullscreenchange" : "mozfullscreenchange";
var vendorRequestFullscreen =
"requestFullscreen" in window.HTMLElement.prototype ? "requestFullscreen" : "mozRequestFullScreen";
var vendorExitFullscreen = "exitFullscreen" in document ? "exitFullscreen" : "mozCancelFullScreen";
var vendorFullscreenElement = "fullscreenEnabled" in document ? "fullscreenElement" : "mozFullScreenElement";
spyOn(window.HTMLElement.prototype, vendorRequestFullscreen).and.callFake(function () {
fullscreenElement = this;
document.dispatchEvent(new Event(vendorChangeEvent));
});
spyOn(document, vendorExitFullscreen).and.callFake(function () {
fullscreenElement = null;
document.dispatchEvent(new Event(vendorChangeEvent));
});
spyOnProperty(document, vendorFullscreenElement).and.callFake(function () {
return fullscreenElement;
});
};
}).call(this);