@digabi/exam-engine-core 23.13.4 → 23.13.8-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/dist/__tests__/playwright/exam/AudioAnswer.test.d.ts +2 -0
  2. package/dist/__tests__/playwright/exam/AudioAnswer.test.d.ts.map +1 -0
  3. package/dist/__tests__/playwright/exam/AudioAnswer.test.js +110 -0
  4. package/dist/__tests__/playwright/exam/AudioAnswer.test.js.map +1 -0
  5. package/dist/__tests__/playwright/stories/exam/AudioAnswer.story.d.ts +5 -0
  6. package/dist/__tests__/playwright/stories/exam/AudioAnswer.story.d.ts.map +1 -0
  7. package/dist/__tests__/playwright/stories/exam/AudioAnswer.story.js +15 -0
  8. package/dist/__tests__/playwright/stories/exam/AudioAnswer.story.js.map +1 -0
  9. package/dist/__tests__/tsconfig.tsbuildinfo +1 -1
  10. package/dist/components/exam/internal/MyAudioRecorder.d.ts +10 -0
  11. package/dist/components/exam/internal/MyAudioRecorder.d.ts.map +1 -0
  12. package/dist/components/exam/internal/MyAudioRecorder.js +106 -0
  13. package/dist/components/exam/internal/MyAudioRecorder.js.map +1 -0
  14. package/dist/components/exam/internal/MyMediaRecorder.d.ts +10 -0
  15. package/dist/components/exam/internal/MyMediaRecorder.d.ts.map +1 -0
  16. package/dist/components/exam/internal/MyMediaRecorder.js +91 -0
  17. package/dist/components/exam/internal/MyMediaRecorder.js.map +1 -0
  18. package/dist/components/shared/internal/AudioErrorRemoveMe.d.ts +8 -0
  19. package/dist/components/shared/internal/AudioErrorRemoveMe.d.ts.map +1 -0
  20. package/dist/components/shared/internal/AudioErrorRemoveMe.js +17 -0
  21. package/dist/components/shared/internal/AudioErrorRemoveMe.js.map +1 -0
  22. package/dist/main-bundle.js +366 -5081
  23. package/dist/store/cas/sagas.d.ts +3 -3
  24. package/package.json +2 -2
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=AudioAnswer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioAnswer.test.d.ts","sourceRoot":"","sources":["../../../../__tests__/playwright/exam/AudioAnswer.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const experimental_ct_react_1 = require("@playwright/experimental-ct-react");
8
+ const AudioAnswer_story_1 = require("../stories/exam/AudioAnswer.story");
9
+ const exam_engine_mastering_1 = require("@digabi/exam-engine-mastering");
10
+ const RECORD = 'Äänitä vastaus';
11
+ const STOP = 'Lopeta äänitys';
12
+ const DELETE = 'Poista äänitys';
13
+ experimental_ct_react_1.test.describe('AudioAnswer', () => {
14
+ let component;
15
+ experimental_ct_react_1.test.beforeEach(async ({ mount }) => {
16
+ const results = await (0, exam_engine_mastering_1.masterExam)(audioXml, () => '', getMediaMetadata);
17
+ const examXml = results[0].xml;
18
+ component = await mount(react_1.default.createElement(AudioAnswer_story_1.AudioAnswerStory, { examXml: examXml }));
19
+ });
20
+ (0, experimental_ct_react_1.test)('contains only button to start recording', async () => {
21
+ await expectStartRecordingButtonToBeVisible();
22
+ });
23
+ (0, experimental_ct_react_1.test)('clicking start button starts recording', async () => {
24
+ await startRecording();
25
+ await expectStopRecordingButtonToBeVisible();
26
+ });
27
+ (0, experimental_ct_react_1.test)('clicking stop button after start stops recording and shows player for the recording', async () => {
28
+ await startRecording();
29
+ await expectTimeElapsed('0:02');
30
+ await stopRecording();
31
+ await expectAudioPlayerToBeVisible();
32
+ });
33
+ (0, experimental_ct_react_1.test)('recording shows time elapsed', async () => {
34
+ await startRecording();
35
+ await expectTimeElapsed('0:01');
36
+ await expectTimeElapsed('0:02');
37
+ await expectTimeElapsed('0:03');
38
+ await stopRecording();
39
+ });
40
+ (0, experimental_ct_react_1.test)('recorded audio can be deleted', async () => {
41
+ await startRecording();
42
+ await expectTimeElapsed('0:03');
43
+ await stopRecording();
44
+ await expectDeleteRecordingButtonToBeVisible();
45
+ await deleteRecording();
46
+ await expectStartRecordingButtonToBeVisible();
47
+ });
48
+ (0, experimental_ct_react_1.test)('recording is available for one audio recorder at the time', async () => {
49
+ await startRecording();
50
+ await expectTimeElapsed('0:01');
51
+ await startRecording(1);
52
+ await expectAlreadyRecordingError(1);
53
+ });
54
+ async function expectButtonToBeVisible(name, nth) {
55
+ await (0, experimental_ct_react_1.expect)(component.locator('.audio-answer').nth(nth).getByRole('button', { name })).toBeVisible();
56
+ }
57
+ async function expectStartRecordingButtonToBeVisible(nth = 0) {
58
+ await expectButtonToBeVisible(RECORD, nth);
59
+ }
60
+ async function expectStopRecordingButtonToBeVisible(nth = 0) {
61
+ await expectButtonToBeVisible(STOP, nth);
62
+ }
63
+ async function expectDeleteRecordingButtonToBeVisible(nth = 0) {
64
+ await expectButtonToBeVisible(DELETE, nth);
65
+ }
66
+ async function expectAudioPlayerToBeVisible(nth = 0) {
67
+ await (0, experimental_ct_react_1.expect)(component.locator('.audio-answer audio').nth(nth)).toBeVisible();
68
+ }
69
+ async function expectAlreadyRecordingError(nth = 0) {
70
+ await (0, experimental_ct_react_1.expect)(component.locator('.audio-answer').nth(nth).locator('.already-recording-error p')).toHaveText('Toisessa tehtävässä on jo käynnissä äänitys. Lopeta se ennen kuin voit aloittaa äänityksen tässä tehtävässä.');
71
+ }
72
+ async function expectTimeElapsed(text, nth = 0) {
73
+ await (0, experimental_ct_react_1.expect)(component.locator('.audio-answer .time-elapsed').nth(nth)).toHaveText(text);
74
+ }
75
+ async function pushButton(name, nth) {
76
+ await component.locator('.audio-answer').nth(nth).getByRole('button', { name }).click();
77
+ }
78
+ async function startRecording(nth = 0) {
79
+ await expectButtonToBeVisible(RECORD, nth);
80
+ await pushButton(RECORD, nth);
81
+ }
82
+ async function stopRecording(nth = 0) {
83
+ await expectButtonToBeVisible(STOP, nth);
84
+ await pushButton(STOP, nth);
85
+ }
86
+ async function deleteRecording(nth = 0) {
87
+ await expectButtonToBeVisible(DELETE, nth);
88
+ await pushButton(DELETE, nth);
89
+ }
90
+ });
91
+ const getMediaMetadata = (_src, _type) => Promise.resolve({ duration: 999 });
92
+ const audioXml = `<e:exam xmlns:e="http://ylioppilastutkinto.fi/exam.xsd" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ylioppilastutkinto.fi/exam.xsd https://abitti.net/schema/exam.xsd" exam-schema-version="0.5">
93
+ <e:exam-versions>
94
+ <e:exam-version lang="fi-FI"/>
95
+ </e:exam-versions>
96
+ <e:exam-title>Exam</e:exam-title>
97
+ <e:exam-instruction/>
98
+ <e:table-of-contents/>
99
+ <e:section>
100
+ <e:section-title>Section</e:section-title>
101
+ <e:section-instruction/>
102
+ <e:question>
103
+ <e:question-title>Audiotehtävä</e:question-title>
104
+ <e:question-instruction />
105
+ <e:audio-answer max-score="5" save-interval="1000" />
106
+ <e:audio-answer max-score="5" save-interval="1000" />
107
+ </e:question>
108
+ </e:section>
109
+ </e:exam>`;
110
+ //# sourceMappingURL=AudioAnswer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioAnswer.test.js","sourceRoot":"","sources":["../../../../__tests__/playwright/exam/AudioAnswer.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export declare const AudioAnswerStory: ({ examXml }: {
3
+ examXml: string;
4
+ }) => React.JSX.Element;
5
+ //# sourceMappingURL=AudioAnswer.story.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioAnswer.story.d.ts","sourceRoot":"","sources":["../../../../../__tests__/playwright/stories/exam/AudioAnswer.story.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,eAAO,MAAM,gBAAgB,GAAI,aAAa;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,sBAGhE,CAAA"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AudioAnswerStory = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const src_1 = require("../../../../src");
9
+ const examServerApi_1 = require("../../../examServerApi");
10
+ const AudioAnswerStory = ({ examXml }) => {
11
+ const doc = new DOMParser().parseFromString(examXml, 'application/xml');
12
+ return react_1.default.createElement(src_1.Exam, { doc: doc, examServerApi: examServerApi_1.examServerApi });
13
+ };
14
+ exports.AudioAnswerStory = AudioAnswerStory;
15
+ //# sourceMappingURL=AudioAnswer.story.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioAnswer.story.js","sourceRoot":"","sources":["../../../../../__tests__/playwright/stories/exam/AudioAnswer.story.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAAyB;AACzB,yCAAsC;AACtC,0DAAsD;AAE/C,MAAM,gBAAgB,GAAG,CAAC,EAAE,OAAO,EAAuB,EAAE,EAAE;IACnE,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAA;IACvE,OAAO,8BAAC,UAAI,IAAC,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,6BAAa,GAAI,CAAA;AACzD,CAAC,CAAA;AAHY,QAAA,gBAAgB,oBAG5B"}