From 5496a35c7569cbc91da86ade5598062e722d7538 Mon Sep 17 00:00:00 2001 From: "maria.cano" Date: Thu, 21 Sep 2023 13:15:25 +0200 Subject: [PATCH 1/2] feat: remove Cypress folder --- views/cypress/README.md | 116 ----- views/cypress/env/env.sample | 7 - .../testPackages/basic-linear-test.zip | Bin 5936 -> 0 bytes .../testPackages/basic-nonlinear-test.zip | Bin 5901 -> 0 bytes .../fixtures/testPackages/manifest.json | 20 - .../testPackages/student-tool-test.zip | Bin 3726 -> 0 bytes .../testPackages/warning-messages-test.zip | Bin 4237 -> 0 bytes .../tests/authoring/test-authoring.spec.js | 211 -------- .../tests/delivery/basic-linear-test.spec.js | 73 --- .../delivery/basic-nonlinear-test.spec.js | 56 --- .../delivery/shared/basic-linear-test.js | 154 ------ .../delivery/shared/basic-nonlinear-test.js | 235 --------- .../delivery/shared/student-tool-test.js | 470 ------------------ .../delivery/shared/warning-messages-test.js | 445 ----------------- .../tests/delivery/student-tool-test.spec.js | 32 -- .../delivery/warning-messages-test.spec.js | 56 --- views/cypress/tests/utils/delivery.js | 103 ---- views/cypress/tests/utils/interactions.js | 119 ----- views/cypress/tests/utils/navigation.js | 81 --- views/cypress/tests/utils/selectors.js | 21 - views/cypress/tests/utils/urls.js | 28 -- 21 files changed, 2227 deletions(-) delete mode 100644 views/cypress/README.md delete mode 100644 views/cypress/env/env.sample delete mode 100644 views/cypress/fixtures/testPackages/basic-linear-test.zip delete mode 100644 views/cypress/fixtures/testPackages/basic-nonlinear-test.zip delete mode 100644 views/cypress/fixtures/testPackages/manifest.json delete mode 100644 views/cypress/fixtures/testPackages/student-tool-test.zip delete mode 100644 views/cypress/fixtures/testPackages/warning-messages-test.zip delete mode 100644 views/cypress/tests/authoring/test-authoring.spec.js delete mode 100644 views/cypress/tests/delivery/basic-linear-test.spec.js delete mode 100644 views/cypress/tests/delivery/basic-nonlinear-test.spec.js delete mode 100644 views/cypress/tests/delivery/shared/basic-linear-test.js delete mode 100644 views/cypress/tests/delivery/shared/basic-nonlinear-test.js delete mode 100644 views/cypress/tests/delivery/shared/student-tool-test.js delete mode 100644 views/cypress/tests/delivery/shared/warning-messages-test.js delete mode 100644 views/cypress/tests/delivery/student-tool-test.spec.js delete mode 100644 views/cypress/tests/delivery/warning-messages-test.spec.js delete mode 100644 views/cypress/tests/utils/delivery.js delete mode 100644 views/cypress/tests/utils/interactions.js delete mode 100644 views/cypress/tests/utils/navigation.js delete mode 100644 views/cypress/tests/utils/selectors.js delete mode 100644 views/cypress/tests/utils/urls.js diff --git a/views/cypress/README.md b/views/cypress/README.md deleted file mode 100644 index f7cf797662..0000000000 --- a/views/cypress/README.md +++ /dev/null @@ -1,116 +0,0 @@ -# E2E testing - -Please refer to the readme file placed at `tao/views/cypress` for generic info about E2E. This file is aimed at describing the E2E for the extension `taoQtiTest`. - -Development of end-to-end tests in TAO is based on the principle of storing the test specs in each relevant extension, while the common and shared features with respect to TAO are stored in `tao-core`. The base engine as well as the very common features are supplied through the dependency `@oat-sa/e2e-runner`. - -The local structure, in `tao-core` is a reduced form of the classic Cypress project structure: - -
-tao
-|-- views
-  |-- cypress.json        # project config
-  |-- cypress/            #
-    |-- envs/             # environment configs
-    |-- fixtures/         # static data used in tests
-    |-- tests/            # root folder of the tests
-    |-- plugins/          # folder for the plugins
-  |  -- support/          # support commands, imports, global setup
-
- -The env files are to be placed in `tao/views/cypress/env`. - -The plugins and command must be stored in respectively `tao/views/cypress/plugins` and `tao/views/cypress/support`. - -> **Note:** For the time being, there is no way to store plugins or commands in each extension. If they are generic enough, say not related to any specific extension, they can be placed in `tao-core`. -> -> Otherwise, the only way to have shared feature for a specific extension is to use local helpers. Often you will see a `utils` folder aside the tests, this is where such helpers will take place. Then can be imported the usual manner thanks to the ES module management. - -## Configuration - -Because tests may be run against various envs (local, demo, staging, etc), we need to have multiple env files. They are stored in `cypress/envs/`, and loaded into the main config according to the key `env.configFile` defined in the `cypress.json`. - -Create `envs/env*.json` file and set it in the `tao/views/cypress.json`: - -```json -{ - "env": { - "configFile": "cypress/envs/env-local.json" - } -} -``` - -> **Note:** The base configuration as described in the `tao-core` extension should be done first. - -For `taoQtiTest`, the following additional config can be added in any `env*.json` file: -```json -{ - "testTakerUser": "e2e_test_taker", - "testTakerPass": "e2e_pass", - "deliveryIds": { - "basicLinearTest": "Delivery of E2E Tests - basic linear test" - } -} -``` - -The sample file `taoQtiTest/views/cypress/env/env.sample` contains an example. - -### Environment setup -In order to have the E2E tests working properly, it is needed to follow these instructions: -- Any test packages from the folder `taoQtiTest/views/cypress/fixtures/testPackages` must be imported in TAO, usually within the namespace `E2E`. -- A specific test taker group must be created to give access to the tests, usually named `E2E` -- A specific test taker must be created, usually named `e2e_test_taker`, and added to the `E2E` group. -- All the E2E related tests must be published and assigned to the group `E2E`, or any group you created for this purpose -- The env file must contain the username and password for the E2E test taker (`testTakerUser` and `testTakerPass`). -- The env file must contain the `deliveryIds` property, filled with the list of test names. The example given above should give a good idea of what needs to be set. Usually the names listed in it should be ok, unless the deliveries have been renamed. - -## Commands - -[Commands](https://docs.cypress.io/api/cypress-api/custom-commands.html) are a key part of Cypress. For now commands can be registered to `Cypress.Commands` in `tao/views/cypress/support/commands` file. -There's no ability to register them within the extensions yet. - -> When registering a local or global command, take care to avoid name collisions with any command you might have imported. - -> **Note:** For the time being, there is no way to store commands in each extension. If they are generic enough, say not related to any specific extension, they can be placed in `tao-core`. -> -> Otherwise, the only way to have shared commands for a specific extension is to use local helpers instead, so not a command actually. Often you will see a `utils` folder aside the tests, this is where such helpers will take place. Then can be imported the usual manner thanks to the ES module management. - -## Plugins - -Plugins can be created in `tao/views/cypress/plugins` directory. -Some plugins also register commands. You can import these files (for their side effects) in the `tao/views/cypress/support/index.js`. - -> **Note:** For the time being, there is no way to store plugins in each extension. If they are generic enough, say not related to any specific extension, they can be placed in `tao-core`. -> -> Otherwise, the only way to have shared features for a specific extension is to use local helpers instead, so not a plugin actually. Often you will see a `utils` folder aside the tests, this is where such helpers will take place. Then can be imported the usual manner thanks to the ES module management. - - -## Fixtures - -Any generic data needed in tests (and not hard-coded) should be placed in `tao/views/cypress/fixtures/`. Can be JSON, JavaScript, zip files, whatever is needed. - -> **Note:** For the time being, there is no way to store fixture in each extension. If they are generic enough, say not related to any specific extension, they can be placed in `tao-core`. -> -> Otherwise, the only way to have shared fixture for a specific extension is to use local helpers instead. Often you will see a `utils` folder aside the tests, this is where such helpers will take place. Then can be imported the usual manner thanks to the ES module management. -> If the fixture is a data packages that doesn't need to get directly accessed from inside the test, it can be placed in the `taoQtiTest/cypress/fixtures` folder. This is how the test packages to import in TAO are supplied. - -## How to run the tests - -To run the tests there's a single entry point in tao core. - -In your tao installation folder: -* `cd tao/views` -* `npm install` -* `npm run cy:open` - to open cypress UI and browser - - or - - `npm run cy:run` - to run the tests headless - -## How to create your tests - -Add .spec files to the `taoQtiTest/views/cypress/tests` folder. - -> Feel free to use common commands from the tao core (located in `tao/views/cypress/support`) - -> For any local feature that needs to be shared, you may create a `utils` folder and add some regular JavaScript module. There is already a bunch of them you can use in `taoQtiTest/views/cypress/tests/utils`. diff --git a/views/cypress/env/env.sample b/views/cypress/env/env.sample deleted file mode 100644 index 21d3169b64..0000000000 --- a/views/cypress/env/env.sample +++ /dev/null @@ -1,7 +0,0 @@ -{ - "testTakerUser": "e2e_test_taker", - "testTakerPass": "e2e_pass", - "deliveryIds": { - "basicLinearTest": "Delivery of E2E Tests - basic linear test" - } -} diff --git a/views/cypress/fixtures/testPackages/basic-linear-test.zip b/views/cypress/fixtures/testPackages/basic-linear-test.zip deleted file mode 100644 index 2edffcc1e79f2eaad6be3a578229722af9428052..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5936 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 diff --git a/views/cypress/fixtures/testPackages/basic-nonlinear-test.zip b/views/cypress/fixtures/testPackages/basic-nonlinear-test.zip deleted file mode 100644 index 4c3e5f5eae46a753011781b0c7dec8c114ad6709..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5901 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 HjD_`Y6$%>0 diff --git a/views/cypress/fixtures/testPackages/manifest.json b/views/cypress/fixtures/testPackages/manifest.json deleted file mode 100644 index 8d28719da2..0000000000 --- a/views/cypress/fixtures/testPackages/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "testPackages": [ - { - "key": "basicLinearTest", - "package": "basic-linear-test.zip" - }, - { - "key": "basicNonLinearTest", - "package": "basic-nonlinear-test.zip" - }, - { - "key": "studentToolTest", - "package": "student-tool-test.zip" - }, - { - "key": "warningMessagesTest", - "package": "warning-messages-test.zip" - } - ] -} diff --git a/views/cypress/fixtures/testPackages/student-tool-test.zip b/views/cypress/fixtures/testPackages/student-tool-test.zip deleted file mode 100644 index 0ff88be3b72b86660ed169479d1c2a3d81228246..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3726 zcmb7{c{CJk-^T|dnMjrtLX9>1EM$oygt4nJgsf9!8T&Rvc2bs+oo;)i?8Z)EEFoL= zqLDSm7FmZ^?|YtepS$xu=Q+=H{c)Y^I@kI9_5J?7zn?yW2FL~g0L}vRT#!cQb#0B~ z)Br#%9RMJ4`fBfC=j1MFF9W#&wShrlGB5}f27yDNveHmFINC-=N)`f@f=ar2*h~00 zIp*JY(wn_~;drfdeCm(^5&c>P6mBH>22D#%)-MAEk&>@UVREJ*d<=Jls5>Ykqsz&2vfwDZci zMPh@$t7ER*hB4Xzt-BzC+euH|ayH%(>$=pCz-b@LGQ@iK2CMJ2HYZkg6B9{A(k zr*U1NYt|Tlcg5PQ&=BG#K!DPCX9wk*Dr(Ca#MGHTAbcxEM!gK0ZQ-h_wP<^dfq-Zjg83 zrffsqlYm z;S-rB_EKavv6|O}fK=zljz&J#qWfN!6pp_9QfPXiK*5PcM2kqd^qpC)!jm3<&27Jv=;H=34dE|bG)?^gc zoYQVE7BhD!2xN|I(v2QM%5Je9)~u}{_({$Dq#GJ(hj@64vRkcWH|Z|F4?STKBi+of z=v~b_G86f(|Ktbfv}uUABq2Ua-uN3)$R%+eSUxWrJb|@eNIBC#oJ_=tl-y~Td06~4 zBvAh!9$})#XEFf+fH&vEIDJ0r9dg`McnWz+so=( z-riJ>dfC82ws)bPLrYfpodbIMKAr13)+yK~O0GXXBQ^%Kkbx;-nSAJDz?@OVC5TvG zsf3%Cjwzbdg+XBjejO4+bjAg7U;OuRiDSMMuCm3Z5-UtEoV@(}@VY4vWda40AAF}1 zdI;@5q=->u>N2+S3sJ@ni>V9L7P_zM)P3w_f9fc@=)?s)K3lvO6&|6hxWs}NNCPh# zj$46mp*tz7dp1gzo%<2PA2zf8nimRD4!FttQb4Z@QQ9uWv1o%|%FWHFpCg9oX_Tkx zOBN5r!ieB&D&8%+tkwd>@l4>pR5x(PyY}@Qc6q_dWX{|Y6m8{{-dK8PgZQxTt$sg~ zTO8cX7m>A-k0UOaL8i7#?vEvJZZ8}-$m>SJq6aOt4mz!7rT9Uzu!VNA4dazXaa+xU zlERtFU83{{ccUgwuY>)Ao_<)SXxo6PlOyqSsA89hrTn2wNDB7g7thPfEXoMTBjtUC zg5dGUt7g)A6tFp&sCMwBO5-HcfG;+8EB!ie%>_3#Da?3ZSfbrnnrB6byuMp*y-Bl? zvPrDO3nIE_GVGaF?sEYlMJp^e!e=htpAxfdOy!3Xm3#&D}!&RF>dpowt7Q?7R*oeJH!fsf^w^d?&kga zln(d5JPx!*Tizmemip~7z?Ukk@*oq7bZ_D8fhYIdv7M7soi$!ii&329AY39zJ+ZZ; zHJm<%JLfos0#>{UX-E&SVGNhxX%sqqH(NQF?R{FrEy1YIo9Emtc-HPN@YDrq?fZ@=b3N6YLEf?m{P6-CcJO$i2 zsFT%fdFJM;;zit7#4Fd0=(-PaO_`a5&6A@m&zQX5XiS~B#>N~|{j;>BGbm~0oyIQ{ z2mp{gjb9HtcaOj0R|*c3hTA~k){q;J)6yarF|q;TDZi z0WL%Qv>5S(PHO~-$Y^9>&khd`HPIm9F({=MI zPYiZ^k1DyZoA6khzECCEY($RY=dYMH6#X*9zKSnyHVd>kcbQxwG3zRZ&`?&eKW^pLD1g5iSb;!Es+&r<}lCj zOnBl~NE_z+fbG4HB_7_4`VuDP(?(p6`>oot@5mH{QPm9Oc*dGu#w42_kmy6ArCrhj z2Ew-(SsPWk7c9BnVZKpwSO{_E@S?q_!d|m2?eedL!7*cQH1n?vh&9LPyM8zP4@WMv zkdh>Ej!#Re(jJ(HJlHwEKmLARr~8V=F8zLAHYo4syHE!*;oQ6_N1+?18sr!o^&3`|;vD?hoWU@O#pO?$!> zd0(jCw1=VW5yMd-qT4aWeA7>0!)>EeV~_6J6%_q?bIa%5)xf=D%k?gHtmVB>q!zOH z)uYSD`PJB68I4s79g6Xt#uJsLb&nO0I4OECELmfucH_I&3B)sCgX^Dyca5AoA9X7D zq*K8&{q8rN+?}kP?a}`dbkYNtNh!9@nZxUESLHSZsHj0jzXmiDC*QGZPjW#&(W82t z%FlWH6`-qP*s5h;6X7%&cVV-;Za*+U_pF4seXxwaNa`b_X!-Vf2Fc);kDzDrKpt=|iMp~e=?C|)?Sr{|^h%bMU!?me5m_mkYG{r1{C zq4(uNDu6YAPIaUs-3()1v(<`UGHEF_Mb0paq7EAhZFGc-XQOPsOkRmXw#EYnh%?w) zwM9`IHG3 z_O-&eU@gb|vRqGuJEK{-=siT3a78?7(eQng;UTux7<5vGJF3#&yWMryG8iSe;m+Dd ziTBKH6E`6Jbo4E=Rg$KC&%FWRe%gQ6`AY1=zR@DplZhYW*5Tre3Y5EXo?aF$TI`!& zf`kfd^7tG;dp2NoRn@sjF{kORPTTv0PF+2L*2D)Pqb+K~jrh*8ylq^*!jSK)EUo7= zz|kk2VQp7~siDJ-KC+gtv$ww>*3|}uc%KL!04%W^N;2tFC(8_y%{2N5Drz>Ge?KRk zO80*kA?Ww<-%U+_vj6Na|Bnm+5Q6w={$&5BZu3v}p8@kXJMeVk`!D0>Pxzl^{u_=t awf7&^)<@8u`TYTSx(%rS071szxBmgWaJI+* diff --git a/views/cypress/fixtures/testPackages/warning-messages-test.zip b/views/cypress/fixtures/testPackages/warning-messages-test.zip deleted file mode 100644 index 41a34de469a9c45addc56cc0326b03461f7c7b98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4237 zcmb7{cQjo4-o{5u5JE%^qYN3{=thg)Mu}cSGQ+6Dgi#`TCq$x)-pepLi6Dpsaflu* zh%y8rO7xO9Ip>}?>z;egdf&VE+H0@y7GZ6oa>vR-7jxO>rxs%A1F&zSz7>C&D%$v>N$L3 z&s-j~5mn=$#Ax4~LDr~=rTYXTXi_B5jN_9a|4T_Jn~kR}tvQEa%?nah=dNmZO-FVYE zZ2&r^U4}EP52whvkd}3yr_-?R5bt$riU|qYx!WF*la&cP8^JcVE{MDaGZb#_z$ez0 zRDGquR#qLATEMOXy;-Ty*iHq!C#|sMxmdQ=fB~Xdw;%tsS}kia`Qg_>MjN@n z@S9g+lsMCOj9*?BGMda7deMK|rX#gj`rheK@Oh4b+o1YNY`ml_c`X-d&5J?|XF=pJ zzoouOR(>jFyUB~87@{;?1MyBav%Zi8xXnRTjM?QLjtbhlRQ_^^{BGYQR0-%A^5vo` zIPr?ff>Ozw&rtXC81S7bI>tr%*NLmNDD|TllqYO)OlDDE8BzP$ANZ2Muh{}TVDs)J z&olTyM9JI1b~E0!pu6`qgzxr`P)BHc$NP>`D+Cc+yduK)ue8DJ`SqP+3L9i?QX*n@5@M1f5^$&pR7w(p@$^L@A+}x^PqZt<6OI=2!XP~a ze_zE2*THcoq&o?&hRr#!3w=EM1h55OZE3$Lx zPQ+9`mSr4V-IKX)-#4DV{c^;pRhT0(oBKCb2b(X_&59bvsw)E&8#dOBJHeAYr;HzQ zomaZNJKNN|-rl|B)5Ts8I+iY;+8Z323hyu{S>7mX zl4lBITduk^FKMSmG7MB`aXLytX2JgGW`?58CWzJ5x_*youM-k{Uc%}4unK*gQ8I!^7Tq&@=8)0KG|brEZz^8)li$2YSskj%#jmA4DxK$<&QVDWS>20w#=+hX9uX(u zi$^GuD<8_rS*DVNr}c*s)tZ8u+7gsiGo;6R)%){G!!!Cbi(z?*G)#RV5!+W9s9&wu zl`Ji#_*)di32#_!X+*HNWXL+crWY3o6;8V$rEb@l9aMbZ6fcS~Gh64cylDXvLbOSthg{X$^7lX4a@V&>Y{oc1PZ@(T7;20=tvL zcK}P7S2Lg%(4~8O=fr^jbHEy)@pUzoTQY@3#36|;_+}&-BCO0q+Cf!Jbj9;9m-j`e z_2XQKazHDxM`~#qt!~H+tc?E=ENA)e|uDmh0!X@OlR?t zuDPlF+?ca$b!Im1MytE)r$)I}8I$d=Cs_rz=0x^)0w+o>qXxX2SC3zuv^UI61^t<5 ze`L#z>;pnyA^^Zc1OO2Fk!YSsjOU-dK+0YODlQ5|K<&lgB6gx82vG@fdn5ub3HiC} z_hMjag`O6s4g6XieWq7MtW1K#VpG74MkbSZSJ8I_m0<51nZI3}e<7AJFQyYS&ubim zJ;r2Z%^YS^jc(yV+BhcKEa7RDoK4Ub$9@{+9{F#``!mr)__r1en5$V1if;igYL>x$ zevTm3z%A(B@kcNdTPZ5qD3i|Cq4T;%mE4tG+m+Q@Sjj91bZSzZ3g$BJCBJ%lZmp1` z7|9&&5#mJA3ySgQV7kWh@N;*&6G)pnLD?5x&fh&U2u->|Siioz!I#|OHtiO+N|OKj z3g;Rj_iC$u7cjP#=W!Ed$4NzggJFB${Q#q_sa>I$(E7?McBYRBainew;>bN&fjkAE zeYn|N{QW)x=@eZ5Hj&U9^`nZnkx>GV9PI9>-yfu5l0%B$q`e;^aIxFJPM=TqEWz&4 z=m^!ZCy0GR#mQr!jK|y=`M~|=vWJkJE|O@QEOVZaONB)Ncc{*-mS&VJtt;(N@p@08j20h68qh5A_ph~z_B$f(OM8opblOhvk z7PcL%a?{ zN6WZ5$>|mG2Hm13#Pj}RBO%JhUB_34RL_&XC$QSFT|-Pse@+enQ2neWt{7Lio0I*Yl%`stGlgk`=TG^m{Vs)(g{X!* zQ)L^M&&o(79ndpjG%MYiy)jeO^8|#H7NZR_U6QT|`d_-5kFy3RJMog*jS|L&w8uKn zb+y|mAfa)15J9=Pf97w`UKwJuXzHd=ItlNPmZ}00vCdjeqF|l{Ji;}tX>R@Yb3+Q0 zq+X$p;BVkuGW+?Y-FfiEOWy75!1bZ1hEp6Z@92<; zv7%|<(%nfK!n!mz{w)H^gxjO*4Ki@%aEe0W^vlX;xO}a|wi-eUIb)V(+wc&7eYz03 zZB(>$Tmd7PwZ1ZjYNr?GpB7r-;%r8UMbZpgl9EgjY8#1_xKxnS_(zCpy+11N6d%@C z=qtZ_dnox~2EB#UGH()1J?ap~ZGy5|_R+z~D7BOXmhdG&Hnwz)QXvj9%iX1Z^8OyV zmc-AU>A2Oc)}?r3*(rPTOKWnkz81Ieye?qhD4W(n*EW&?b21haC$aJZ4b3q#5rY&2 za^$SJJoLLY%tKX+wv9GHU4i=noIst0J@e-GT(vL0K4=PCs@)WwKWN*jsFhh*RWOw| zl|;NXi};EeK*E#-6 pnvwLso$7zp{%gGa(w@EYA7P`fO>*hy29h6l7Xbj!aP{Zc{{U!)U4H-o diff --git a/views/cypress/tests/authoring/test-authoring.spec.js b/views/cypress/tests/authoring/test-authoring.spec.js deleted file mode 100644 index b4250d6264..0000000000 --- a/views/cypress/tests/authoring/test-authoring.spec.js +++ /dev/null @@ -1,211 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2021 (original work) Open Assessment Technologies SA ; - */ - -import urls from '../utils/urls'; -import selectors from '../utils/selectors'; -import urlsItems from '../../../../../taoItems/views/cypress/utils/urls'; -import selectorsItems from '../../../../../taoItems/views/cypress/utils/selectors'; -import pathsItems from '../../../../../taoItems/views/cypress/utils/paths'; -import { getRandomNumber } from '../../../../../tao/views/cypress/utils/helpers'; - -describe('Test authoring', () => { - const className = `Test E2E class ${getRandomNumber()}`; - const classNameItems = `Test E2E class ${getRandomNumber()}`; - const packagesPath = `${pathsItems.baseItemsPath}/fixtures/packages`; - const undoSelector = '.undobox a.undo'; - const closeUndoSelector = '.undobox .icon-close'; - const closeSavePopupSelector = '.feedback-success.popup .icon-close'; - - /** - * Removes items, undo and remove again - * @param {String} deleteSelector - css selector of delete button - * @param {String} item - interaction name - * @param {String} itemSelector - css selector of the interaction container - */ - function removeItem(deleteSelector, itemName, itemSelector) { - cy.log('REMOVING INTERACTION', itemName); - cy.get(deleteSelector).click({ force: true }); - cy.log(itemName, 'IS REMOVED'); - - cy.get(undoSelector).should('exist'); - cy.get(undoSelector).click(); - cy.log(itemName, 'UNDO REMOVE'); - cy.get(itemSelector).contains(itemName).should('exist'); - cy.get(undoSelector).should('not.exist'); - - cy.get(deleteSelector).click({ force: true }); - cy.log(itemName, 'IS REMOVED'); - cy.get(undoSelector).should('exist'); - cy.get(closeUndoSelector).click(); - } - - /** - * Log in and wait for render - * After @treeRender click root class - */ - before(() => { - // import item on page Items - cy.log('setup Items page'); - cy.setup(selectorsItems.treeRenderUrl, selectorsItems.editClassLabelUrl, urlsItems.items, selectorsItems.root); - cy.log('add class in Items page'); - cy.addClassToRoot( - selectorsItems.root, - selectorsItems.itemClassForm, - classNameItems, - selectorsItems.editClassLabelUrl, - selectorsItems.treeRenderUrl, - selectorsItems.addSubClassUrl - ); - cy.log('select class'); - cy.selectNode(selectorsItems.root, selectorsItems.itemClassForm, classNameItems); - cy.log('import to class'); - cy.importToSelectedClass(selectorsItems.importItem, `${packagesPath}/e2e_item.zip`, selectorsItems.importItemUrl, classNameItems); - // go to page Tests - cy.log('setup Tests page'); - cy.setup(selectors.treeRenderUrl, selectors.editClassLabelUrl, urls.tests, selectors.root); - }); - - /** - * Visit the page Items - * Delete test folder - */ - after(() => { - cy.intercept('POST', '**/edit*').as('edit'); - cy.visit(urlsItems.items); - cy.wait('@edit'); - - cy.deleteClassFromRoot( - selectorsItems.root, - selectorsItems.itemClassForm, - selectorsItems.deleteClass, - selectorsItems.deleteConfirm, - classNameItems, - selectorsItems.deleteClassUrl, - true - ); - }); - - /** - * Tests - */ - describe('Add test section', () => { - it('Creates a new test class', function () { - cy.addClassToRoot( - selectors.root, - selectors.testClassForm, - className, - selectors.editClassLabelUrl, - selectors.treeRenderUrl, - selectors.addSubClassUrl - ); - }); - - it('Creates and rename a new test', function () { - cy.selectNode(selectors.root, selectors.testClassForm, className) - .addNode(selectors.testForm, selectors.addTest) - .renameSelectedNode(selectors.testForm, selectors.editTestUrl, 'Test E2E test 1'); - }); - - it('Authors the test', function () { - cy.get(selectors.authoring).click(); - cy.location().should(loc => { - expect(`${loc.pathname}${loc.search}`).to.eq(urls.testAuthoring); - }); - }); - - it('Adds new section and test part', function () { - cy.get(selectors.addSection).click(); - cy.get(selectors.addPart).click(); - cy.get('.section').should('have.length', 3); - cy.get('.testpart').should('have.length', 2); - }); - - it('Adds item to the fist section', function () { - cy.get(`.item-selection .class a[title="${classNameItems}"]`).last().click(); - cy.getSettled(`.item-selection .instance a[title="Test E2E item 1"]`).click(); - cy.get('.test-content #assessmentSection-1 .itemref-placeholder').click(); - cy.get('.test-content #assessmentSection-1 .itemrefs').contains('Test E2E item 1').should('exist'); - }); - - it('Adds item to the second section', function () { - cy.getSettled(`.item-selection .instance a[title="Test E2E item 1"]`).click(); - cy.get('.test-content #assessmentSection-2 .itemref-placeholder').click(); - cy.get('.test-content #assessmentSection-2 .itemrefs').contains('Test E2E item 1').should('exist'); - }); - - it('Adds item to the last section by searching name', function () { - cy.get('.search input').type('Test E2E item 1'); - cy.getSettled('.resource-list a[title="Test E2E item 1"]').last().click(); - cy.get('.test-content #assessmentSection-3 .itemref-placeholder').click(); - cy.get('.test-content #assessmentSection-3 .itemrefs').contains('Test E2E item 1').should('exist'); - }); - - it('Save test with items', function () { - cy.intercept('POST', '**/saveTest*').as('saveTest'); - cy.get('[data-testid="save-test"]').click(); - cy.wait('@saveTest').its('response.body').its('saved').should('eq', true); - cy.get(closeSavePopupSelector).click(); - }); - - it('Remove item, undo and remove in the first section', function () { - removeItem('.test-content #assessmentSection-1 .itemrefs [data-delete]', 'Test E2E item 1', '.test-content #assessmentSection-1 .itemrefs'); - }); - - it('Save test after removing item', function () { - cy.intercept('POST', '**/saveTest*').as('saveTest'); - cy.get('[data-testid="save-test"]').click(); - cy.wait('@saveTest').its('response.body').its('saved').should('eq', true); - cy.get(closeSavePopupSelector).click(); - }); - - it('Remove item, undo and remove in the second section', function () { - removeItem('.test-content #assessmentSection-2 .itemrefs [data-delete]', 'Test E2E item 1', '.test-content #assessmentSection-2 .itemrefs'); - }); - - it('Save test after removing item', function () { - cy.intercept('POST', '**/saveTest*').as('saveTest'); - cy.get('[data-testid="save-test"]').click(); - cy.wait('@saveTest').its('response.body').its('saved').should('eq', true); - cy.get(closeSavePopupSelector).click(); - }); - - it('Remove item, undo and remove in the last section', function () { - removeItem('.test-content #assessmentSection-3 .itemrefs [data-delete]', 'Test E2E item 1', '.test-content #assessmentSection-3 .itemrefs'); - }); - - it('Save test after removing item', function () { - cy.intercept('POST', '**/saveTest*').as('saveTest'); - cy.get('[data-testid="save-test"]').click(); - cy.wait('@saveTest').its('response.body').its('saved').should('eq', true); - cy.get(closeSavePopupSelector).click(); - }); - - it('Deletes test class', function () { - cy.visit(urls.tests); - cy.deleteClassFromRoot( - selectors.root, - selectors.testClassForm, - selectors.deleteClass, - selectors.deleteConfirm, - className, - selectors.deleteTestUrl, - false - ); - }); - }); -}); diff --git a/views/cypress/tests/delivery/basic-linear-test.spec.js b/views/cypress/tests/delivery/basic-linear-test.spec.js deleted file mode 100644 index 5215b1d89b..0000000000 --- a/views/cypress/tests/delivery/basic-linear-test.spec.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2021 Open Assessment Technologies SA ; - */ - -/** - * Note: this test requires the following: - * - a dedicated user is created and defined in the the cypress env file through the properties testTakerUser and testTakerPass - * - the test `taoQtiTest/views/cypress/fixtures/testPackages/basic_linear_test.zip` is imported - * - the test is published and assigned to the user defined in the env file - * - the delivery name is supplied through the cypress env file from the property deliveryIds.basicLinearTest - * - * See the fixtures folder - */ - -import { basicLinearTestSpecs } from './shared/basic-linear-test'; -import { - loginAsTestTaker, - goToIndexPage, - goToHome, - launchDelivery, - resumeDelivery, - checkReturnPage -} from "../utils/delivery.js"; - -describe('Regular launch of the basic linear test with 4 items', () => { - const deliveryKey = 'basicLinearTest'; - - describe('Regular launch', () => { - it('successfully login', () => { - loginAsTestTaker(); - }); - - it('opens the index page', () => { - goToIndexPage(); - }); - - it('successfully launches the test', () => { - launchDelivery(deliveryKey); - }); - - it('successfully return to the home page', () => { - goToHome(); - }); - - it('successfully resumes the test', () => { - resumeDelivery(deliveryKey); - }); - }); - - describe('Basic linear test with 4 items', () => { - basicLinearTestSpecs(); - }); - - describe('Regular end', () => { - it('redirects the page', () => { - checkReturnPage(); - }); - }); -}); \ No newline at end of file diff --git a/views/cypress/tests/delivery/basic-nonlinear-test.spec.js b/views/cypress/tests/delivery/basic-nonlinear-test.spec.js deleted file mode 100644 index 110dbc92ba..0000000000 --- a/views/cypress/tests/delivery/basic-nonlinear-test.spec.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2021 Open Assessment Technologies SA ; - */ - -/** - * Note: this test requires the following: - * - a dedicated user is created and defined in the the cypress env file through the properties testTakerUser and testTakerPass - * - the test `taoQtiTest/views/cypress/fixtures/testPackages/basic-nonlinear-test.zip` is imported - * - the test is published and assigned to the user defined in the env file - * - the delivery name is supplied through the cypress env file from the property deliveryIds.basicNonLinearTest - * - * See the fixtures folder - */ - -import { basicNonLinearFirstLaunchSpecs, basicNonLinearSecondLaunchSpecs } from './shared/basic-nonlinear-test'; -import { loginAndLaunchDelivery, checkReturnPage } from '../utils/delivery.js'; - -describe('Basic non-linear test navigation', () => { - const deliveryKey = 'basicNonLinearTest'; - - describe('Next/Previous/End navigation', () => { - before(() => { - loginAndLaunchDelivery(deliveryKey); - }); - after(() => { - checkReturnPage(); - }); - - basicNonLinearFirstLaunchSpecs(); - }); - - describe('Skip/Skip-and-end navigation', () => { - before(() => { - loginAndLaunchDelivery(deliveryKey); - }); - after(() => { - checkReturnPage(); - }); - - basicNonLinearSecondLaunchSpecs(); - }); -}); diff --git a/views/cypress/tests/delivery/shared/basic-linear-test.js b/views/cypress/tests/delivery/shared/basic-linear-test.js deleted file mode 100644 index f4e3b14785..0000000000 --- a/views/cypress/tests/delivery/shared/basic-linear-test.js +++ /dev/null @@ -1,154 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2021 Open Assessment Technologies SA ; - */ - -import { goToNextItem, endTest } from '../../utils/navigation.js' -import { - interactions, - expectInteractions, - expectChoices, - toggleChoice, - expectChoiceChecked, - toggleMatchChoice, - expectMatchChoiceChecked -} from '../../utils/interactions.js' - -export function basicLinearTestSpecs() { - it('displays the first item with choices', () => { - cy.get('.qti-item').within(() => { - expectInteractions('choiceInteraction', 2); - expectInteractions('inlineChoiceInteraction', 1); - - expectChoices(0, 4); - expectChoices(1, 4); - - cy.get(interactions.choiceInteraction).find('input').should('not.be.checked'); - }); - }); - - it('can select multiple choices', () => { - toggleChoice(0, 1); - toggleChoice(0, 2); - - expectChoiceChecked(0, 0, false); - expectChoiceChecked(0, 1, true); - expectChoiceChecked(0, 2, true); - expectChoiceChecked(0, 3, false); - }); - - it('can only select one choice', () => { - toggleChoice(1, 1); - toggleChoice(1, 2); - - expectChoiceChecked(1, 0, false); - expectChoiceChecked(1, 1, false); - expectChoiceChecked(1, 2, true); - expectChoiceChecked(1, 3, false); - }); - - it('can select an inline choice', () => { - cy.get('select.qti-inlineChoiceInteraction').should('not.have.value'); - cy.get('.qti-inlineChoiceInteraction-dropdown').should('not.be.visible'); - - cy.get('div.qti-inlineChoiceInteraction').click(); - cy.get('.qti-inlineChoiceInteraction-dropdown').should('be.visible'); - - cy.get('.qti-inlineChoiceInteraction-dropdown li').eq(2).click(); - cy.get('select.qti-inlineChoiceInteraction').should('have.value', 'choice_10'); - cy.get('.qti-inlineChoiceInteraction-dropdown').should('not.be.visible'); - }); - - it('can move to the next item', () => { - goToNextItem(); - }); - - it('displays the second item with text entries', () => { - cy.get('.qti-item').within(() => { - expectInteractions('extendedTextInteraction', 1); - expectInteractions('textEntryInteraction', 1); - - cy.get(interactions.extendedTextInteraction).find('.text-container').should('have.value', ''); - cy.get(interactions.textEntryInteraction).should('have.value', ''); - }); - }); - - it('can type a text', () => { - const fixtureText = 'This is a text'; - - cy.get(interactions.extendedTextInteraction).within(() => { - cy.get('.text-container').type(fixtureText); - cy.get('.text-container').should('have.value', fixtureText); - }); - - cy.get(interactions.textEntryInteraction).type(fixtureText); - cy.get(interactions.textEntryInteraction).should('have.value', fixtureText); - }); - - it('can move to the next item', () => { - goToNextItem(); - }); - - it('displays the third item with match choices', () => { - cy.get('.qti-item').within(() => { - expectInteractions('matchInteraction', 1); - - cy.get(interactions.matchInteraction).within(() => { - cy.get('input').should('have.length', 8); - cy.get('input').should('not.be.checked'); - cy.get('.instruction-container .feedback-success').should('have.length', 1); - cy.get('.instruction-container .feedback-warning').should('have.length', 0); - }); - }); - }); - - it('can select match choices', () => { - toggleMatchChoice(0, 0, 0); - toggleMatchChoice(0, 1, 1); - toggleMatchChoice(0, 2, 1); - toggleMatchChoice(0, 3, 0); - - cy.get(interactions.matchInteraction).find('.instruction-container .feedback-success').should('have.length', 1); - - toggleMatchChoice(0, 2, 0); - toggleMatchChoice(0, 3, 1); - - cy.get(interactions.matchInteraction).find('.instruction-container .feedback-warning').should('have.length', 1); - - expectMatchChoiceChecked(0, 0, 0, true); - expectMatchChoiceChecked(0, 0, 1, false); - expectMatchChoiceChecked(0, 1, 0, false); - expectMatchChoiceChecked(0, 1, 1, true); - expectMatchChoiceChecked(0, 2, 0, false); - expectMatchChoiceChecked(0, 2, 1, true); - expectMatchChoiceChecked(0, 3, 0, true); - expectMatchChoiceChecked(0, 3, 1, false); - }); - - it('can move to the next item', () => { - goToNextItem(); - }); - - it('displays the last item', () => { - const fixtureText = 'This is the last item of the test'; - cy.get('.qti-item').should('have.length', 1); - cy.get('.qti-item').should('contain', fixtureText); - }); - - it('finishes the test', () => { - endTest(); - }); -} diff --git a/views/cypress/tests/delivery/shared/basic-nonlinear-test.js b/views/cypress/tests/delivery/shared/basic-nonlinear-test.js deleted file mode 100644 index f171b9c135..0000000000 --- a/views/cypress/tests/delivery/shared/basic-nonlinear-test.js +++ /dev/null @@ -1,235 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2021 Open Assessment Technologies SA ; - */ - -import { - goToNextItem, - goToPreviousItem, - endTest, - skipToNextItem, - skipAndEndTest, - navigationSelectors -} from '../../utils/navigation.js'; -import { - interactions, - expectInteractions, - expectChoices, - toggleChoice, - expectChoiceChecked -} from '../../utils/interactions.js'; - -function expectNavigationButton(selector, exists) { - cy.get('.navi-box-list').within(() => { - if (exists) { - cy.get(selector).should('exist').and('be.visible'); - } else { - if (selector === navigationSelectors.goToPreviousItem) { - cy.get(selector).should('not.be.visible'); - } else { - cy.get(selector).should('not.exist'); - } - } - }); -} - -export function basicNonLinearFirstLaunchSpecs() { - it('displays the first item, with next/skip buttons', () => { - //check that first item is loaded - cy.get('.qti-item').within(() => { - expectInteractions('choiceInteraction', 2); - expectChoices(0, 4); - expectChoiceChecked(0, 0, false); - expectChoiceChecked(0, 1, false); - expectChoiceChecked(0, 2, false); - expectChoiceChecked(0, 3, false); - }); - - //existing buttons - expectNavigationButton(navigationSelectors.goToNextItem, true); - expectNavigationButton(navigationSelectors.skipToNextItem, true); - - //not existing buttons - expectNavigationButton(navigationSelectors.goToPreviousItem, false); - expectNavigationButton(navigationSelectors.endTest, false); - expectNavigationButton(navigationSelectors.skipAndEndTest, false); - }); - - it('select an answer in the first item', () => { - //later we will check if answer is restored or not - toggleChoice(0, 1); - toggleChoice(0, 2); - - expectChoiceChecked(0, 0, false); - expectChoiceChecked(0, 1, true); - expectChoiceChecked(0, 2, true); - expectChoiceChecked(0, 3, false); - }); - - it('moves to the next item', () => { - goToNextItem(); - }); - - it('displays the second item, with previous/next/skip buttons', () => { - //check that second item is loaded - cy.get('.qti-item').within(() => { - expectInteractions('textEntryInteraction', 1); - cy.get(interactions.textEntryInteraction).should('have.value', ''); - }); - - //existing buttons - expectNavigationButton(navigationSelectors.goToNextItem, true); - expectNavigationButton(navigationSelectors.skipToNextItem, true); - expectNavigationButton(navigationSelectors.goToPreviousItem, true); - - //not existing buttons - expectNavigationButton(navigationSelectors.endTest, false); - expectNavigationButton(navigationSelectors.skipAndEndTest, false); - }); - - it('select an answer in the second item', () => { - //later we will check if answer is restored or not - cy.get(interactions.textEntryInteraction).type('This is a text'); - cy.get(interactions.textEntryInteraction).should('have.value', 'This is a text'); - }); - - it('moves to the previous item', () => { - goToPreviousItem(); - }); - - it('answer in the first item is restored', () => { - //we left first item with 'next' button, then returned to it - expectInteractions('choiceInteraction', 2); - expectChoiceChecked(0, 0, false); - expectChoiceChecked(0, 1, true); - expectChoiceChecked(0, 2, true); - expectChoiceChecked(0, 3, false); - }); - - it('moves to the next item', () => { - goToNextItem(); - }); - - it('answer in the second item is restored', () => { - //we left second item with 'previous' button, then returned to it - expectInteractions('textEntryInteraction', 1); - cy.get(interactions.textEntryInteraction).should('have.value', 'This is a text'); - }); - - it('move to the last item', () => { - //repeat until the last item - goToNextItem(); - //check that third item is loaded - cy.get('.qti-item').within(() => { - expectInteractions('matchInteraction', 1); - }); - goToNextItem(); - }); - - it('displays the last item, with end/skip-end buttons', () => { - //check that last item is loaded - cy.get('.qti-item').should('exist').should('contain', 'This is the last item of the test'); - - //existing buttons - expectNavigationButton(navigationSelectors.endTest, true); - expectNavigationButton(navigationSelectors.skipAndEndTest, true); - expectNavigationButton(navigationSelectors.goToPreviousItem, true); - - //not existing buttons - expectNavigationButton(navigationSelectors.goToNextItem, false); - expectNavigationButton(navigationSelectors.skipToNextItem, false); - }); - - it('ends the test', () => { - //only clicks end button: successful completion must be checked by the following test cases - endTest(); - }); -} - -export function basicNonLinearSecondLaunchSpecs() { - it('displays the first item', () => { - //check that first item is loaded - cy.get('.qti-item').within(() => { - expectInteractions('choiceInteraction', 2); - expectChoices(0, 4); - expectChoiceChecked(0, 0, false); - expectChoiceChecked(0, 1, false); - expectChoiceChecked(0, 2, false); - expectChoiceChecked(0, 3, false); - }); - expectNavigationButton(navigationSelectors.skipToNextItem, true); - }); - - it('select an answer in the first item', () => { - //later we will check if answer is restored or not - toggleChoice(0, 1); - toggleChoice(0, 2); - - expectChoiceChecked(0, 0, false); - expectChoiceChecked(0, 1, true); - expectChoiceChecked(0, 2, true); - expectChoiceChecked(0, 3, false); - }); - - it('skips to the next item', () => { - skipToNextItem(); - }); - - it('displays the second item', () => { - //check that second item is loaded - cy.get('.qti-item').within(() => { - expectInteractions('textEntryInteraction', 1); - }); - expectNavigationButton(navigationSelectors.goToPreviousItem, true); - //go back - goToPreviousItem(); - }); - - it('answer in the first item is discarded', () => { - //we left first item with 'skip' button, then returned to it - expectInteractions('choiceInteraction', 2); - expectChoiceChecked(0, 0, false); - expectChoiceChecked(0, 1, false); - expectChoiceChecked(0, 2, false); - expectChoiceChecked(0, 3, false); - }); - - it('move to the last item', () => { - //repeat until the last item - skipToNextItem(); - //check that second item is loaded - cy.get('.qti-item').within(() => { - expectInteractions('textEntryInteraction', 1); - }); - skipToNextItem(); - //check that third item is loaded - cy.get('.qti-item').within(() => { - expectInteractions('matchInteraction', 1); - }); - skipToNextItem(); - }); - - it('displays the last item', () => { - //check that last item is loaded - cy.get('.qti-item').should('exist').should('contain', 'This is the last item of the test'); - expectNavigationButton(navigationSelectors.skipAndEndTest, true); - }); - - it('skips last item and ends the test', () => { - //only clicks skip-end button: successful completion must be checked by the following test cases - skipAndEndTest(); - }); -} diff --git a/views/cypress/tests/delivery/shared/student-tool-test.js b/views/cypress/tests/delivery/shared/student-tool-test.js deleted file mode 100644 index b987f759e8..0000000000 --- a/views/cypress/tests/delivery/shared/student-tool-test.js +++ /dev/null @@ -1,470 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2021 Open Assessment Technologies SA ; - */ - -import { endTest, goToNextItem, skipAndEndTest } from '../../utils/navigation.js'; -import { - expectInteractions, - expectChoices, - toggleChoice, - expectChoiceChecked, -} from '../../utils/interactions.js'; - -const toolName = Object.freeze({ - calculator: 'calculator', - mask: 'answer-masking', - eliminator: 'eliminator', - areaMask: 'area-masking', - lineReader: 'line-reader', - magnifier: 'magnify', -}); - -export function studentToolTest () { - function openTool (name) { - cy.get(`.tools-box-list [data-control=${name}]:not(.active) a`).first().should('have.length', 1).and('be.visible').click(); - } - - function closeTool (name) { - cy.get(`.tools-box-list [data-control=${name}].active a`).first().should('have.length', 1).and('be.visible').click(); - } - - function createCalculatorAlias () { - cy.get('.test-runner-scope .widget-calculator').and('not.be.visible').as('calcContainer'); - cy.get('@calcContainer').find('.dynamic-component-container').as('calc'); - cy.get('@calc').find('a[title="Close"]').as('closer'); - } - - describe('Calculator/Answer masking/Answer elimination', () => { - before(() => { - expectInteractions('choiceInteraction', 1); - expectChoices(0, 4); - }); - - after(() => { - goToNextItem(); - }); - - describe('Calculator tool', () => { - after(() => { - closeTool(toolName.calculator); - }); - - it('opens/closes', function() { - openTool(toolName.calculator); - createCalculatorAlias(); - cy.get('@calc').find('.calcDisplay').as('display'); - cy.get('@calc').should('be.visible'); - closeTool(toolName.calculator); - cy.get('@calc').should('not.be.visible'); - openTool(toolName.calculator); - cy.get('@calc').should('be.visible'); - // click close => hide - cy.get('@closer').click(); - cy.get('@calc').should('not.be.visible'); - }); - - it('calculates', function() { - openTool(toolName.calculator); - createCalculatorAlias(); - cy.get('@calc').find('.calcDisplay').as('display'); - // 2 + 2 => 4 - cy.get('@calc').find('[data-key="2"]').click(); - cy.get('@calc').find('[data-key="+"]').click(); - cy.get('@calc').find('[data-key="2"]').click(); - cy.get('@calc').find('[data-key="="]').click(); - cy.get('@display').should('have.value', '4'); - // clear - cy.get('@calc').find('[data-key="C"]').click(); - cy.get('@display').should('have.value', '0'); - }); - }); - - describe('Answer masking tool', function() { - after(() => { - closeTool(toolName.mask); - }); - - it('turns on/off', function() { - expectInteractions('choiceInteraction', 1); - expectChoices(0, 4); - openTool(toolName.mask); - cy.get('.qti-choice.masked').should('have.length', 4); - cy.get('.qti-choice.masked .answer-mask.masked').should('have.length', 4); - closeTool(toolName.mask); - cy.get('.qti-choice.masked').should('have.length', 0); - cy.get('.qti-choice.masked .answer-mask.masked').should('have.length', 0); - }); - - it('controls single choice mask', function() { - openTool(toolName.mask); - // unmask first choice - cy.get('.qti-choice.masked:eq(0) .answer-mask-toggle').as('toggle1'); - cy.get('@toggle1').click(); - cy.get('.qti-choice.masked').should('have.length', 3); - cy.get('.qti-choice.masked .answer-mask.masked').should('have.length', 3); - // remask first choice - cy.get('@toggle1').click(); - cy.get('.qti-choice.masked').should('have.length', 4); - cy.get('.qti-choice.masked .answer-mask.masked').should('have.length', 4); - // see if choice is really covered (not clickable) - cy.get('.pseudo-label-box').then(($el1) => { - cy.get('.answer-mask.masked').should(($el2) => { - expect($el2.width()).to.be.closeTo($el1.width(), 20); - }); - }); - }); - }); - - describe('Answer elimination tool', function() { - it('turns on/off', function() { - openTool(toolName.eliminator); - cy.get('.qti-choice [data-eliminable="container"]').should('have.length', 4).and('be.visible'); - closeTool(toolName.eliminator); - expectChoices(0, 4); - cy.get('.qti-choice [data-eliminable="container"]').should('have.length', 4).and('not.be.visible'); - }); - - it('eliminates single choice', function() { - openTool(toolName.eliminator); - cy.get('.qti-choice').its(0).within(() => { - cy.get('[data-eliminable="trigger"]').as('firstTrigger'); - // eliminate first choice - cy.get('@firstTrigger').click(); - cy.get('.pseudo-label-box input:disabled').should('exist'); - // un-eliminate first choice - cy.get('@firstTrigger').click(); - cy.get('.pseudo-label-box input:disabled').should('not.exist'); - }); - toggleChoice(0, 0); - expectChoiceChecked(0, 0, true); - }); - }); - }); - - describe('Calculator BODMAS/Area masking/Highlighter/Line reader', () => { - after(() => { - cy.get('.qti-extendedTextInteraction textarea').type('x'); - goToNextItem(); - }); - before(() => { - expectInteractions('extendedTextInteraction', 1); - expectInteractions('textEntryInteraction', 1); - }); - describe('Calculator BODMAS tool', () => { - after(() => { - closeTool(toolName.calculator); - }); - - it('calculates', function() { - openTool(toolName.calculator); - createCalculatorAlias(); - cy.get('@calc').find('.calculator-screen').as('display'); - cy.get('@calc').should('be.visible'); - cy.get('@display').find('.term[data-value=0]').should('be.visible'); - - // (1 + 2) * 3 => 9 - cy.get('@calc').find('[data-param="LPAR"]').click(); - cy.get('@calc').find('[data-param="NUM1"]').click(); - cy.get('@calc').find('[data-param="ADD"]').click(); - cy.get('@calc').find('[data-param="NUM2"]').click(); - cy.get('@calc').find('[data-param="RPAR"]').click(); - cy.get('@calc').find('[data-param="MUL"]').click(); - cy.get('@calc').find('[data-param="NUM3"]').click(); - cy.get('@calc').find('[data-command="execute"]').click(); - cy.get('@display').find('.term[data-value=9]').should('be.visible'); - // clear - cy.get('@calc').find('[data-command="clear"]').click(); - cy.get('@display').find('.term[data-value=0]').should('be.visible'); - }); - }); - - describe('Area mask tool', function() { - function openMaskTool () { - cy.get('.tools-box-list [data-control=area-masking] a').click(); - } - - function closeAreaMaskTool () { - cy.get('@areaMask').last().find('.controls .close').click(); - } - - function createAliases () { - cy.get('.test-runner-scope .mask-container').as('areaMaskContainer'); - cy.get('@areaMaskContainer').find('.mask').as('areaMask'); - cy.get('@areaMask').should('be.visible'); - cy.get('@areaMask').find('.inner').as('inner'); - cy.get('@areaMask').find('.controls .view').as('viewer'); - } - - it('launches/destroys', function() { - openMaskTool(); - createAliases(); - cy.get('@areaMaskContainer').should('exist'); - closeAreaMaskTool(); - cy.get('@areaMaskContainer').should('not.exist'); - }); - - it('unhides content', function() { - openMaskTool(); - createAliases(); - // look through - cy.get('@viewer').click(); - cy.get('@areaMaskContainer').should('have.class', 'previewing'); - cy.get('@inner').should('have.css', 'opacity', '0.15'); - // un-look through - // the component uses a default delay of 3000ms before restoring the mask - cy.wait(3000); - cy.get('@areaMaskContainer').should('not.have.class', 'previewing'); - cy.get('@inner').should('have.css', 'opacity', '1'); - closeAreaMaskTool(); - }); - - it('can have multiple instances', function() { - // add multiple instances (max 5) - for (let i = 0; i < 6; i++) { - openMaskTool(); - } - createAliases(); - cy.get('@areaMask').should('have.length', 5); - // clean up - for (let i = 0; i < 5; i++) { - closeAreaMaskTool(); - } - cy.get('.mask-container').should('not.exist'); - }); - }); - - describe('Highlighter tool', () => { - function highlight () { - cy.get('.tools-box-list [data-control=highlight-trigger] a').click(); - } - - function clearHighlights () { - cy.get('.tools-box-list [data-control=highlight-clear] a').click(); - } - - function selectRange (subject) { - cy.wrap(subject).find('p').its(0).trigger('mousedown').then(($el) => { - const el = $el[0]; - const document = el.ownerDocument; - const range = document.createRange(); - range.selectNodeContents(el); - document.getSelection().removeAllRanges(range); - document.getSelection().addRange(range); - }).trigger('mouseup'); - - cy.document().trigger('selectionchange'); - } - - it('highlights (selection first)', function() { - cy.get('.qti-item').within(($item) => { - selectRange($item); - }); - highlight(); - cy.get('.qti-itemBody .txt-user-highlight').contains('lorem').and('has.css', 'background-color', 'rgb(255, 255, 0)'); - clearHighlights(); - cy.get('.qti-itemBody').should('not.contain', 'span.txt-user-highlight'); - }); - - it('highlights (tool first)', function() { - highlight(); - //selectText - cy.get('.qti-item').within(($item) => { - selectRange($item); - }); - cy.get('.qti-itemBody .txt-user-highlight').contains('Lorem').and('has.css', 'background-color', 'rgb(255, 255, 0)'); - clearHighlights(); - cy.get('.qti-itemBody').should('not.contain', 'span.txt-user-highlight'); - }); - }); - - describe('Line reader tool', () => { - function createAliases () { - cy.get('.line-reader-mask').as('maskParts').should('have.length', 8).and('be.visible'); - cy.get('.line-reader-overlay').as('overlay').should('be.visible'); - cy.get('.line-reader-overlay .icon').as('outerDrag').should('be.visible'); - cy.get('.line-reader-inner-drag').as('innerDrag').should('be.visible'); - cy.get('.line-reader-closer').as('closer').should('be.visible'); - } - - it('opens/closes', function() { - openTool(toolName.lineReader); - createAliases(); - cy.get('@maskParts').should('be.visible'); - closeTool(toolName.lineReader); - cy.get('@maskParts').should('not.be.visible'); - openTool(toolName.lineReader); - cy.get('@maskParts').should('be.visible'); - cy.get('@closer').click(); - cy.get('@maskParts').should('not.be.visible'); - }); - }); - }); - - describe('Scientific calculator/Zoom/Magnifier', () => { - before(() => { - expectInteractions('extendedTextInteraction', 1); - expectInteractions('textEntryInteraction', 1); - }); - - after(() => { - //only clicks end button: successful completion must be checked by the following test cases - cy.get('[data-control="move-end"]').first().click(); - }); - - describe('Scientific calculator tool', () => { - function createAliases () { - cy.get('.test-runner-scope .widget-calculator').and('not.be.visible').as('calcContainer'); - cy.get('@calcContainer').find('.dynamic-component-container').as('calc'); - cy.get('@calc').find('a[title="Close"]').as('closer'); - cy.get('@calc').find('.calculator-screen').as('display'); - } - - after(() => { - closeTool(toolName.calculator); - }); - - it('opens/closes', function() { - expectInteractions('extendedTextInteraction', 1); - expectInteractions('textEntryInteraction', 1); - openTool(toolName.calculator); - createAliases(); - cy.get('@calc').should('be.visible'); - closeTool(toolName.calculator); - cy.get('@calc').should('not.be.visible'); - openTool(toolName.calculator); - cy.get('@calc').should('be.visible'); - cy.get('@closer').click(); - cy.get('@calc').should('not.be.visible'); - }); - - it('calculates', function() { - openTool(toolName.calculator); - createAliases(); - cy.get('@calc').should('be.visible'); - cy.get('@display').should('have.value', ''); - // 3 to the 3 power => 27 - cy.get('@calc').find('[data-param="NUM3"]').click(); - cy.get('@calc').find('[data-param="POW NUM3"]').click(); - cy.get('@calc').find('[data-command="execute"]').click(); - cy.get('@display').contains('27'); - // clear - cy.get('@calc').find('[data-command="clear"]').click(); - cy.get('@display').should('have.value', ''); - }); - }); - - describe('Zoom tool', () => { - function zoomIn () { - cy.get('[data-control=zoomIn] a').should('have.length', 1).and('be.visible').click(); - } - - function zoomOut () { - cy.get('[data-control=zoomOut] a').should('have.length', 1).and('be.visible').click(); - } - - function checkZoomValue (zoomValue) { - cy.get('.qti-item').first().should('have.class', 'transform-scale').and('have.attr', 'style').and('contain', `scaleX(${zoomValue})`).and('contain', `scaleY(${zoomValue})`); - } - - it('zooms in/out', function() { - zoomOut(); - checkZoomValue(0.9); - zoomOut(); - checkZoomValue(0.8); - // reset - zoomIn(); - zoomIn(); - // zoom in - zoomIn(); - checkZoomValue(1.1); - zoomIn(); - checkZoomValue(1.2); - // beyond the max! (2.0) - for (let i = 0; i < 10; i++) { - zoomIn(); - } - checkZoomValue(2); - // reset - for (let i = 0; i < 10; i++) { - zoomOut(); - } - cy.get('.qti-item').first().should('not.have.class', 'transform-scale').should('have.css', 'transform', 'none'); - }); - }); - - // Note: the magnifier is tested last, because it duplicates the DOM and can break other tests - describe('Magnifier tool', function() { - function creatAliases () { - cy.get('.runner > .magnifier-container').as('magnifierContainer'); - cy.get('@magnifierContainer').find('.magnifier').first().as('magnifier'); - cy.get('@magnifier').should('be.visible'); - cy.get('@magnifier').find('[data-control="closeMagnifier"]').first().as('closer'); - cy.get('@magnifier').find('.inner').first().as('inner'); - } - - function checkMagnifying (expectedMultiplicity) { - cy.get('@inner').should('exist').and('be.visible').and('have.attr', 'style').and('contain', `scale(${expectedMultiplicity})`); - } - - function zoomOut () { - cy.get('@magnifier').find(':not(.inner) .control[data-control="zoomOut"]').click(); - } - - function zoomIn () { - cy.get('@magnifier').find(':not(.inner) .control[data-control="zoomIn"]').click(); - } - - it('opens/closes', function() { - openTool(toolName.magnifier); - creatAliases(); - cy.get('@magnifier').should('be.visible'); - closeTool(toolName.magnifier); - cy.get('@magnifier').should('not.be.visible'); - openTool(toolName.magnifier); - cy.get('@magnifier').should('be.visible'); - // click close => hide - cy.get('@closer').click(); - cy.get('@magnifier').should('not.be.visible'); - }); - - it('zooms in/out', function() { - openTool(toolName.magnifier); - creatAliases(); - // initial transform scale applied (2x) - checkMagnifying(2); - // zoom out (min zoom 2x) - zoomOut(); - checkMagnifying(2); - // zoom in (scales in 0.5 incrs) - zoomIn(); - checkMagnifying(2.5); - zoomIn(); - checkMagnifying(3); - // zoom out - zoomOut(); - checkMagnifying(2.5); - // zoom in (max zoom 8x) - for (let i = 0; i < 12; i++) { - zoomIn(); - } - // now 8.5x - checkMagnifying(8); - closeTool(toolName.magnifier); - }); - }); - }); -} diff --git a/views/cypress/tests/delivery/shared/warning-messages-test.js b/views/cypress/tests/delivery/shared/warning-messages-test.js deleted file mode 100644 index 6ed4c3dbd3..0000000000 --- a/views/cypress/tests/delivery/shared/warning-messages-test.js +++ /dev/null @@ -1,445 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2021 Open Assessment Technologies SA ; - */ - -import { goToNextItem, endTest, goToPreviousItem } from '../../utils/navigation.js'; -import { interactions, expectInteractions, toggleChoice, expectChoiceChecked } from '../../utils/interactions.js'; - -/** - * Check that item is loaded (= navigation was finished successfully) - * Use item interactions and section title to identify item - * @param {string} sectionTitle - * @param {string} interactionType - */ -function expectItemLoaded(sectionTitle, interactionType) { - cy.get('[data-control="qti-test-position"]').contains(`Section ${sectionTitle}`); - if (interactionType === 'choice') { - expectInteractions('choiceInteraction', 2); - } else { - expectInteractions('textEntryInteraction', 1); - } -} - -function answerInteraction(interactionType) { - if (interactionType === 'choice') { - toggleChoice(0, 1); - expectChoiceChecked(0, 1, true); - } else { - cy.get(interactions.textEntryInteraction).type('This is a text').should('have.value', 'This is a text'); - } -} - -/** - * Check dialog is shown - * @param {string} title - * @param {string} text - * @param {Array} buttons - */ -function expectDialog(title, text, buttons) { - cy.get('.modal') - .should('be.visible') - .within(() => { - cy.get('.message').should('have.text', `${title}${text}`); - cy.get('.buttons button').should('have.length', buttons.length); - buttons.forEach(btnText => { - cy.get('.buttons button').contains(regexEqualCaseInsensitive(btnText)); - }); - }); -} - -function expectDialogClosed() { - cy.get('.modal').should('not.exist'); -} - -function clickDialogButton(btnText) { - cy.get('.modal .buttons button').contains(regexEqualCaseInsensitive(btnText)).click(); -} - -/** - * Argument for 'cy.contains', to check case insensitive equality - * @param {*} text - * @returns {RegExp} - */ -function regexEqualCaseInsensitive(text) { - return new RegExp(`^${text}$`, 'i'); -} - -const allowSkippingTitle = ''; -const allowSkippingText = 'A response to this item is required.'; -const allowSkippingButtons = ['ok']; - -export function warningMessagesFirstLaunchSpecs() { - describe('Display Next Part Warning', () => { - it('if true, dialog on leaving test part when has unanswered', () => { - const dialogTitle = 'You are about to submit this test part.'; - const dialogText = - 'There is 1 unanswered question in this part of the test. Click "SUBMIT THIS PART" to continue.'; - const dialogButtons = ['submit this part', 'cancel']; - - //first item in test part, do not answer it - expectItemLoaded('1-1', 'text'); - goToNextItem(); - //second item in test part, answer it - expectItemLoaded('1-2', 'choice'); - answerInteraction('choice'); - goToNextItem(); - //third, last item in test part, answer it - expectItemLoaded('1-2', 'text'); - answerInteraction('text'); - goToNextItem(); - //dialog - expectDialog(dialogTitle, dialogText, dialogButtons); - //cancel dialog - clickDialogButton(dialogButtons[1]); - expectDialogClosed(); - goToNextItem(); - //dialog is shown again - expectDialog(dialogTitle, dialogText, dialogButtons); - //continue in dialog - clickDialogButton(dialogButtons[0]); - //first item of next test part is loaded - expectItemLoaded('5-1', 'text'); - expectDialogClosed(); - }); - }); - - describe('Display Unanswered Warning', () => { - it('if true, dialog on leaving test part when has unanswered', () => { - const dialogTitle = 'You are about to submit this test part.'; - const dialogText = - 'There is 1 unanswered question in this part of the test. Click "SUBMIT THIS PART" to continue.'; - const dialogButtons = ['submit this part', 'cancel']; - - //first item in test part, do not answer it - expectItemLoaded('5-1', 'text'); - goToNextItem(); - //second item in test part, answer it - expectItemLoaded('5-2', 'choice'); - answerInteraction('choice'); - goToNextItem(); - //third, last item in tets part, answer it - expectItemLoaded('5-2', 'text'); - answerInteraction('text'); - goToNextItem(); - //dialog - expectDialog(dialogTitle, dialogText, dialogButtons); - //cancel dialog - clickDialogButton(dialogButtons[1]); - expectDialogClosed(); - goToNextItem(); - //dialog is shown again - expectDialog(dialogTitle, dialogText, dialogButtons); - //continue in dialog - clickDialogButton(dialogButtons[0]); - //first item of next test part is loaded - expectItemLoaded('2-1', 'text'); - expectDialogClosed(); - }); - }); - - describe('Hide Timed Section Warning', () => { - it('if true, no dialog on leaving section when not timed out', () => { - //first item in section - expectItemLoaded('2-1', 'text'); - goToNextItem(); - //second item in section - expectItemLoaded('2-1', 'choice'); - goToNextItem(); - //no dialog; first item of next section is loaded - expectItemLoaded('2-2', 'choice'); - expectDialogClosed(); - }); - }); - - describe('Do not show alert on timeout', () => { - it('if true, no dialog on leaving section when timed out', () => { - //first item in section - expectItemLoaded('2-2', 'choice'); - //advance clock to reach timeout, also wait to ensure timer code runs - //eslint-disable-next-line cypress/no-unnecessary-waiting - cy.wait(200); - cy.clock().tick(60 * 1000); - //no dialog; first item of next section is loaded - expectItemLoaded('3-1', 'text'); - expectDialogClosed(); - }); - }); - - describe('Allow Skipping', () => { - it('no dialog on moving from unanswered item if: item=true [section=false, part=false]', () => { - //also, this is first item in section - expectItemLoaded('3-1', 'text'); - goToNextItem(); - //no dialog; next item is loaded - expectItemLoaded('3-1', 'choice'); - expectDialogClosed(); - }); - - it('dialog on moving from unanswered item if: on item=false [section=false, part=false]', () => { - expectItemLoaded('3-1', 'choice'); - goToNextItem(); - //dialog - expectDialog(allowSkippingTitle, allowSkippingText, allowSkippingButtons); - //close dialog - clickDialogButton(allowSkippingButtons[0]); - expectDialogClosed(); - answerInteraction('choice'); - goToNextItem(); - //no dialog, next item is loaded - expectItemLoaded('3-2', 'text'); - expectDialogClosed(); - }); - - it('dialog on moving from unanswered item if: on item=false [section=true, part=false]', () => { - expectItemLoaded('3-2', 'text'); - goToNextItem(); - //dialog - expectDialog(allowSkippingTitle, allowSkippingText, allowSkippingButtons); - //close dialog - clickDialogButton(allowSkippingButtons[0]); - expectDialogClosed(); - answerInteraction('text'); - goToNextItem(); - //no dialog, next item is loaded - expectItemLoaded('3-2', 'choice'); - expectDialogClosed(); - }); - - it('no dialog on moving from unanswered item if: item=true [section=true, part=false]', () => { - //also, this is last item in section - expectItemLoaded('3-2', 'choice'); - goToNextItem(); - //no dialog; next item is loaded - expectItemLoaded('4-1', 'choice'); - expectDialogClosed(); - }); - - it('dialog on moving from unanswered item if: on item=false [section=true, part=true]', () => { - expectItemLoaded('4-1', 'choice'); - goToNextItem(); - //dialog - expectDialog(allowSkippingTitle, allowSkippingText, allowSkippingButtons); - //close dialog - clickDialogButton(allowSkippingButtons[0]); - expectDialogClosed(); - answerInteraction('choice'); - goToNextItem(); - //no dialog, next item is loaded - expectItemLoaded('4-2', 'text'); - expectDialogClosed(); - }); - - it('dialog on moving from unanswered item if: on item=false [section=false, part=true]', () => { - expectItemLoaded('4-2', 'text'); - endTest(); - //dialog - expectDialog(allowSkippingTitle, allowSkippingText, allowSkippingButtons); - //close dialog - clickDialogButton(allowSkippingButtons[0]); - expectDialogClosed(); - answerInteraction('text'); - }); - }); - - describe('Display End Test Warning', () => { - it('if true, dialog on ending test when has unanswered', () => { - const dialogTitle = 'You are about to submit the test.'; - const dialogText = - 'There are 8 unanswered questions. You will not be able to access this test once submitted. ' + - 'Click "SUBMIT THE TEST" to continue and submit the test.'; - const dialogButtons = ['submit the test', 'cancel']; - - //last item in test - expectItemLoaded('4-2', 'text'); - endTest(); - //dialog - expectDialog(dialogTitle, dialogText, dialogButtons); - //cancel dialog - clickDialogButton(dialogButtons[1]); - expectDialogClosed(); - endTest(); - //dialog is shown again - expectDialog(dialogTitle, dialogText, dialogButtons); - //continue in dialog - clickDialogButton(dialogButtons[0]); - //that test was actually ended should be checked afterwards - expectDialogClosed(); - }); - }); -} - -export function warningMessagesSecondLaunchSpecs() { - describe('Display Next Part Warning', () => { - it('if true, dialog on leaving test part when all answered', () => { - const dialogTitle = 'You are about to submit this test part. '; - const dialogText = 'Click "SUBMIT THIS PART" to continue.'; - const dialogButtons = ['submit this part', 'cancel']; - - //first item in test part, answer it - expectItemLoaded('1-1', 'text'); - answerInteraction('text'); - goToNextItem(); - //second item in test part, answer it - expectItemLoaded('1-2', 'choice'); - answerInteraction('choice'); - goToNextItem(); - //third, last item in test part, answer it - expectItemLoaded('1-2', 'text'); - answerInteraction('text'); - goToNextItem(); - //dialog - expectDialog(dialogTitle, dialogText, dialogButtons); - //cancel dialog - clickDialogButton(dialogButtons[1]); - expectDialogClosed(); - goToNextItem(); - //dialog is shown again - expectDialog(dialogTitle, dialogText, dialogButtons); - //continue in dialog - clickDialogButton(dialogButtons[0]); - //first item of next test part is loaded - expectItemLoaded('5-1', 'text'); - expectDialogClosed(); - }); - }); - - describe('Display Unanswered Warning', () => { - it('if true, no dialog on leaving test part when all answered', () => { - //first item in test part, answer it - expectItemLoaded('5-1', 'text'); - answerInteraction('text'); - goToNextItem(); - //second item in test part, answer it - expectItemLoaded('5-2', 'choice'); - answerInteraction('choice'); - goToNextItem(); - //third, last item in tets part, answer it - expectItemLoaded('5-2', 'text'); - answerInteraction('text'); - goToNextItem(); - //no dialog; first item of next test part is loaded - expectItemLoaded('2-1', 'text'); - expectDialogClosed(); - }); - }); - - describe('Do not show alert on timeout', () => { - it('if false, dialog on leaving section when timed out', () => { - const dialogTitle = ''; - const dialogText = 'The time limit has been reached for this part of the test.'; - const dialogButtons = ['ok']; - - //first item in section - expectItemLoaded('2-1', 'text'); - answerInteraction('text'); - goToNextItem(); - //second item in section, let's asnwer it for another test case and go back - expectItemLoaded('2-1', 'choice'); - answerInteraction('choice'); - goToPreviousItem(); - expectItemLoaded('2-1', 'text'); - //advance clock to reach timeout, also wait to ensure timer code runs - //eslint-disable-next-line cypress/no-unnecessary-waiting - cy.wait(200); - cy.clock().tick(60 * 1000); - //dialog - expectDialog(dialogTitle, dialogText, dialogButtons); - //continue in dialog - clickDialogButton(dialogButtons[0]); - //first item of next section is loaded - expectItemLoaded('2-2', 'choice'); - expectDialogClosed(); - }); - }); - - describe('Hide Timed Section Warning', () => { - it('if false, dialog on leaving section when not timed out', () => { - const dialogTitle = 'You are about to leave this section.'; - const dialogText = - 'You answered 2 of 2 question(s) for this section of the test. Click "Close this Section" to continue.' + - 'Once you close this section, you cannot return to it or change your answers.'; - const dialogButtons = ['close this section', 'review my answers']; - - //first item in section - expectItemLoaded('2-2', 'choice'); - answerInteraction('choice'); - goToNextItem(); - //second item in section - expectItemLoaded('2-2', 'text'); - answerInteraction('text'); - goToNextItem(); - //dialog - expectDialog(dialogTitle, dialogText, dialogButtons); - //cancel dialog - clickDialogButton(dialogButtons[1]); - expectDialogClosed(); - goToNextItem(); - //dialog is shown again - expectDialog(dialogTitle, dialogText, dialogButtons); - //continue in dialog - clickDialogButton(dialogButtons[0]); - //first item of next section is loaded - expectItemLoaded('3-1', 'text'); - expectDialogClosed(); - }); - }); - - describe('Display End Test Warning', () => { - it('[chore] continue until last item', () => { - expectItemLoaded('3-1', 'text'); - answerInteraction('text'); - goToNextItem(); - expectItemLoaded('3-1', 'choice'); - answerInteraction('choice'); - goToNextItem(); - expectItemLoaded('3-2', 'text'); - answerInteraction('text'); - goToNextItem(); - expectItemLoaded('3-2', 'choice'); - answerInteraction('choice'); - goToNextItem(); - expectItemLoaded('4-1', 'choice'); - answerInteraction('choice'); - goToNextItem(); - expectItemLoaded('4-2', 'text'); - }); - - it('if true, dialog on ending test when all answered', () => { - const dialogTitle = 'You are about to submit the test. '; - const dialogText = - 'You will not be able to access this test once submitted. Click "SUBMIT THE TEST" to continue and submit the test.'; - const dialogButtons = ['submit the test', 'cancel']; - - //last item in test - expectItemLoaded('4-2', 'text'); - answerInteraction('text'); - endTest(); - //dialog - expectDialog(dialogTitle, dialogText, dialogButtons); - //cancel dialog - clickDialogButton(dialogButtons[1]); - expectDialogClosed(); - endTest(); - //dialog is shown again - expectDialog(dialogTitle, dialogText, dialogButtons); - //continue in dialog - clickDialogButton(dialogButtons[0]); - //that test was actually ended should be checked afterwards - expectDialogClosed(); - }); - }); -} diff --git a/views/cypress/tests/delivery/student-tool-test.spec.js b/views/cypress/tests/delivery/student-tool-test.spec.js deleted file mode 100644 index c502b9f190..0000000000 --- a/views/cypress/tests/delivery/student-tool-test.spec.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2021 Open Assessment Technologies SA ; - */ - -import { studentToolTest } from './shared/student-tool-test.js'; -import { checkReturnPage, loginAndLaunchDelivery } from '../utils/delivery.js'; - -describe('Basic behavior of student tools', () => { - before(() => { - loginAndLaunchDelivery('studentToolTest'); - }); - - after(() => { - checkReturnPage(); - }); - - studentToolTest(); -}); diff --git a/views/cypress/tests/delivery/warning-messages-test.spec.js b/views/cypress/tests/delivery/warning-messages-test.spec.js deleted file mode 100644 index cc67667031..0000000000 --- a/views/cypress/tests/delivery/warning-messages-test.spec.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2021 Open Assessment Technologies SA ; - */ - -/** - * Note: this test requires the following: - * - a dedicated user is created and defined in the the cypress env file through the properties testTakerUser and testTakerPass - * - the test `taoQtiTest/views/cypress/fixtures/testPackages/warning-messages-test.zip` is imported - * - the test is published and assigned to the user defined in the env file - * - the delivery name is supplied through the cypress env file from the property deliveryIds.warningMessagesTest - * - * See the fixtures folder - */ - -import { warningMessagesFirstLaunchSpecs, warningMessagesSecondLaunchSpecs } from './shared/warning-messages-test.js'; -import { loginAndLaunchDelivery, checkReturnPage } from '../utils/delivery.js'; - -describe('Test warning messages', () => { - const deliveryKey = 'warningMessagesTest'; - - describe('Test warning messages (part 1)', () => { - before(() => { - loginAndLaunchDelivery(deliveryKey); - }); - after(() => { - checkReturnPage(); - }); - - warningMessagesFirstLaunchSpecs(); - }); - - describe('Test warning messages (part 2)', () => { - before(() => { - loginAndLaunchDelivery(deliveryKey); - }); - after(() => { - checkReturnPage(); - }); - - warningMessagesSecondLaunchSpecs(); - }); -}); diff --git a/views/cypress/tests/utils/delivery.js b/views/cypress/tests/utils/delivery.js deleted file mode 100644 index eaf8809d20..0000000000 --- a/views/cypress/tests/utils/delivery.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2021 Open Assessment Technologies SA ; - */ - -import { getFullUrl } from '../../../../../tao/views/cypress/utils/helpers.js'; -import urls from "./urls"; - -/** - * Logs in as a test taker - */ -export function loginAsTestTaker() { - const username = Cypress.env('testTakerUser'); - const password = Cypress.env('testTakerPass'); - - cy.loginAsUser(username, password); -} - -/** - * Redirects to the index page - */ -export function goToIndexPage() { - cy.visit(urls.index); -} - -/** - * Redirects to the index page by clicking the home button - */ -export function goToHome() { - cy.get('.loading-bar').should('not.be.visible'); - - cy.get('[data-control="home"] a').click(); - - cy.location().should(location => { - expect(`${location.origin}${location.pathname}`).to.equal(getFullUrl(urls.index)); - }); -} - -/** - * Launches a test from the index page, with respect to the given selector - * @param {String} selector - The DOM Selector targeting the entry points - * @param {String} deliveryKey - The name of the delivery to start, as displayed in the list - */ -function startDelivery(selector, deliveryKey) { - const deliveryName = Cypress.env('deliveryIds')[deliveryKey]; - - cy.get(selector).contains(deliveryName).within($el => { - const launchUrl = $el.parents(selector).data('launch_url'); - cy.visit(launchUrl); - }); - - cy.location().should(location => { - expect(`${location.origin}${location.pathname}`).to.equal(getFullUrl(urls.execution)); - }); -} - -/** - * Launches a test from the index page - * @param {String} deliveryKey - The name of the delivery to start, as displayed in the list - */ -export function launchDelivery(deliveryKey) { - startDelivery('.entry-point-all-deliveries', deliveryKey); -} - -/** - * Resumes a test from the index page - * @param {String} deliveryKey - The name of the delivery to start, as displayed in the list - */ -export function resumeDelivery(deliveryKey) { - startDelivery('.entry-point-started-deliveries', deliveryKey); -} - -/** - * Checks the return page at the end of the LTI session - */ -export function checkReturnPage() { - cy.location().should(location => { - expect(`${location.origin}${location.pathname}`).to.equal(getFullUrl(urls.index)); - }); -} - -/** - * Logs in as a test taker and launches a test from the index page - * @param {String} deliveryKey - The name of the delivery to start, as displayed in the list - */ -export function loginAndLaunchDelivery(deliveryKey) { - loginAsTestTaker(); - goToIndexPage(); - launchDelivery(deliveryKey); -} diff --git a/views/cypress/tests/utils/interactions.js b/views/cypress/tests/utils/interactions.js deleted file mode 100644 index 3ab37d82ae..0000000000 --- a/views/cypress/tests/utils/interactions.js +++ /dev/null @@ -1,119 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2021 Open Assessment Technologies SA ; - */ - -/** - * Gets the DOM selector for a type of interaction - * @param {String} type - * @returns {string} - */ -export function getInteractionSelector(type) { - return `[data-qti-class="${type}"]`; -} - -/** - * A list o DOM selector by interaction types - * @type {Object} - */ -export const interactions = { - choiceInteraction: getInteractionSelector('choiceInteraction'), - inlineChoiceInteraction: getInteractionSelector('inlineChoiceInteraction'), - extendedTextInteraction: getInteractionSelector('extendedTextInteraction'), - textEntryInteraction: getInteractionSelector('textEntryInteraction'), - matchInteraction: getInteractionSelector('matchInteraction'), -}; - -/** - * Expects a given number of a type of interaction - * @param {String} type - * @param {Number} number - */ -export function expectInteractions(type, number) { - cy.get(getInteractionSelector(type)).should('have.length', number); -} - -/** - * Expects a given number of choices for one interaction - * @param {Number} interactionIndex - The index of the targeted choiceInteraction - * @param {Number} number - */ -export function expectChoices(interactionIndex, number) { - cy.get(getInteractionSelector('choiceInteraction')) - .eq(interactionIndex) - .find('li.qti-choice') - .should('have.length', number); -} - -/** - * Toggles the value of a choice in a choiceInteraction - * @param {Number} interactionIndex - The index of the targeted choiceInteraction - * @param {Number} choiceIndex - The index of the choice inside the targeted choiceInteraction - */ -export function toggleChoice(interactionIndex, choiceIndex) { - cy.get(getInteractionSelector('choiceInteraction')) - .eq(interactionIndex) - .find('li.qti-choice .label-box') - .eq(choiceIndex) - .click(); -} - -/** - * Checks the state of choice in a choiceInteraction - * @param {Number} interactionIndex - The index of the targeted choiceInteraction - * @param {Number} choiceIndex - The index of the choice inside the targeted choiceInteraction - * @param {Boolean} isChecked - The expected state - */ -export function expectChoiceChecked(interactionIndex, choiceIndex, isChecked) { - cy.get(getInteractionSelector('choiceInteraction')) - .eq(interactionIndex) - .find('li.qti-choice input') - .eq(choiceIndex) - .should(isChecked ? 'be.checked' : 'not.be.checked'); -} - -/** - * Toggles the value of a choice in a matchInteraction - * @param {Number} interactionIndex - The index of the targeted matchInteraction - * @param {Number} rowIndex - The index of the row inside the targeted matchInteraction - * @param {Number} columnIndex - The index of the column inside the targeted matchInteraction - */ -export function toggleMatchChoice(interactionIndex, rowIndex, columnIndex) { - cy.get(getInteractionSelector('matchInteraction')) - .eq(interactionIndex) - .find('tbody tr') - .eq(rowIndex) - .find('td label') - .eq(columnIndex) - .click(); -} - -/** - * Checks the state of a choice in a matchInteraction - * @param {Number} interactionIndex - The index of the targeted matchInteraction - * @param {Number} rowIndex - The index of the row inside the targeted matchInteraction - * @param {Number} columnIndex - The index of the column inside the targeted matchInteraction - * @param {Boolean} isChecked - The expected state - */ -export function expectMatchChoiceChecked(interactionIndex, rowIndex, columnIndex, isChecked) { - cy.get(getInteractionSelector('matchInteraction')) - .eq(interactionIndex) - .find('tbody tr') - .eq(rowIndex) - .find('td input') - .eq(columnIndex) - .should(isChecked ? 'be.checked' : 'not.be.checked'); -} diff --git a/views/cypress/tests/utils/navigation.js b/views/cypress/tests/utils/navigation.js deleted file mode 100644 index b9fb2bac25..0000000000 --- a/views/cypress/tests/utils/navigation.js +++ /dev/null @@ -1,81 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2021 Open Assessment Technologies SA ; - */ - -/** - * Base query selector for navigation buttons - * @param {String} direction - * @returns {String} - */ -function baseNavSelector(direction) { - return `[data-control="${direction}"]`; -} - -/** - * Clicks the navigation control button - * @param {String} selector - */ -function navigate(selector) { - cy.get(selector).click(); -} - -/** - * Query selectors for navigation buttons - * @type {Object} - */ -export const navigationSelectors = { - goToNextItem: baseNavSelector('move-forward'), - goToPreviousItem: baseNavSelector('move-backward'), - skipToNextItem: baseNavSelector('skip'), - endTest: baseNavSelector('move-end'), - skipAndEndTest: baseNavSelector('skip-end') -}; - -/** - * Navigates to the next item - */ -export function goToNextItem() { - navigate(navigationSelectors.goToNextItem); -} - -/** - * Navigates to the previous item - */ -export function goToPreviousItem() { - navigate(navigationSelectors.goToPreviousItem); -} - -/** - * Ends the test from the last item - */ -export function endTest() { - navigate(navigationSelectors.endTest); -} - -/** - * Skips to the next item - */ -export function skipToNextItem() { - navigate(navigationSelectors.skipToNextItem); -} - -/** - * Ends the test skipping the last item - */ -export function skipAndEndTest() { - navigate(navigationSelectors.skipAndEndTest); -} diff --git a/views/cypress/tests/utils/selectors.js b/views/cypress/tests/utils/selectors.js deleted file mode 100644 index 42b78fa768..0000000000 --- a/views/cypress/tests/utils/selectors.js +++ /dev/null @@ -1,21 +0,0 @@ -export default { - addTest: '[data-context="resource"][data-action="instanciate"]', - addSubClassUrl: 'taoTests/Tests/addSubClass', - - deleteClass: '[data-context="resource"][data-action="removeNode"]', - deleteTestUrl: 'taoTests/Tests/delete', - deleteConfirm: '[data-control="ok"]', - - editClassLabelUrl: 'taoTests/Tests/editClassLabel', - editTestUrl: 'taoTests/Tests/editTest', - - root: '[data-uri="http://www.tao.lu/Ontologies/TAOTest.rdf#Test"]', - - testForm: 'form[action="/taoTests/Tests/editTest"]', - testClassForm: 'form[action="/taoTests/Tests/editClassLabel"]', - treeRenderUrl: 'taoTests/Tests', - - authoring: '[data-context="instance"][data-action="launchEditor"]', - addSection: '[data-testid="add-section"]', - addPart: '[data-testid="add-test-part"]' -}; diff --git a/views/cypress/tests/utils/urls.js b/views/cypress/tests/utils/urls.js deleted file mode 100644 index f9536b9746..0000000000 --- a/views/cypress/tests/utils/urls.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2021 Open Assessment Technologies SA ; - */ - -/** - * A list of well known URLS in the context of the delivery - * @type {Object} - */ -export default { - index: '/taoDelivery/DeliveryServer/index', - execution: '/taoDelivery/DeliveryServer/runDeliveryExecution', - tests: '/tao/Main/index?structure=tests&ext=taoTests§ion=manage_tests', - testAuthoring: '/tao/Main/index?structure=tests&ext=taoTests§ion=authoring' -}; From 994b4a3e157acaf3e9266cd165ffb6e1168797d6 Mon Sep 17 00:00:00 2001 From: "maria.cano" Date: Thu, 21 Sep 2023 13:15:40 +0200 Subject: [PATCH 2/2] feat: remove e2e folder --- .../e2e/_helpers/commands/cleanupCommands.js | 86 ---- .../_helpers/commands/navigationCommands.js | 53 --- .../e2e/_helpers/commands/pointerCommands.js | 77 ---- .../js/e2e/_helpers/commands/setupCommands.js | 266 ------------ .../e2e/_helpers/routes/backOfficeRoutes.js | 41 -- views/js/e2e/_helpers/routes/runnerRoutes.js | 29 -- .../_helpers/selectors/cleanupSelectors.js | 38 -- .../selectors/interactionSelectors.js | 88 ---- .../_helpers/selectors/navigationSelectors.js | 30 -- .../e2e/_helpers/selectors/runnerSelectors.js | 25 -- .../e2e/_helpers/selectors/setupSelectors.js | 39 -- views/js/e2e/_helpers/urls/backOfficeUrls.js | 28 -- views/js/e2e/_helpers/urls/runnerUrls.js | 24 -- .../base64LocalQtiExampleTestPackage.js | 24 -- .../base64RemoteQtiExampleTestPackage.js | 24 -- .../js/e2e/deliveries/localDeliveries.spec.js | 72 ---- .../e2e/deliveries/remoteDeliveries.spec.js | 133 ------ .../interactions/associate/associate.spec.js | 113 ------ .../base64AssociateInteractionTestPackage.js | 25 -- .../js/e2e/interactions/choice/choice.spec.js | 128 ------ .../base64ChoiceInteractionTestPackage.js | 25 -- .../extendedtext/extendedtext.spec.js | 138 ------- .../base64ExtendedTextInteractionTest.js | 23 -- .../fileupload/fileupload.spec.js | 197 --------- .../base64FileUploadInteractionTest.js | 25 -- .../fileupload/fixtures/sample.png | Bin 7354 -> 0 bytes .../fileupload/fixtures/sample.zip | Bin 7174 -> 0 bytes .../base64HottextInteractionTestPackage.js | 23 -- .../e2e/interactions/hottext/hottext.spec.js | 129 ------ .../js/e2e/interactions/inline/choice.spec.js | 108 ----- .../fixtures/inlineChoiceInteractionTest.js | 19 - .../inlineTextEntryInteractionTest.js | 19 - .../e2e/interactions/inline/textEntry.spec.js | 115 ------ .../base64ChoiceInteractionTestPackage.js | 26 -- views/js/e2e/interactions/match/match.spec.js | 123 ------ .../fixtures/base64MediaInteractionTest.js | 25 -- views/js/e2e/interactions/media/media.spec.js | 381 ------------------ .../order/fixtures/orderInteractionTest.js | 19 - views/js/e2e/interactions/order/order.spec.js | 277 ------------- .../fixtures/base64SliderInteractionTest.js | 25 -- .../js/e2e/interactions/slider/slider.spec.js | 129 ------ .../base64NavigationLinearTestPackage.js | 25 -- .../base64NavigationNonLinearTestPackage.js | 25 -- .../e2e/runner/navigation/navigation.spec.js | 376 ----------------- 44 files changed, 3595 deletions(-) delete mode 100644 views/js/e2e/_helpers/commands/cleanupCommands.js delete mode 100644 views/js/e2e/_helpers/commands/navigationCommands.js delete mode 100644 views/js/e2e/_helpers/commands/pointerCommands.js delete mode 100644 views/js/e2e/_helpers/commands/setupCommands.js delete mode 100644 views/js/e2e/_helpers/routes/backOfficeRoutes.js delete mode 100644 views/js/e2e/_helpers/routes/runnerRoutes.js delete mode 100644 views/js/e2e/_helpers/selectors/cleanupSelectors.js delete mode 100644 views/js/e2e/_helpers/selectors/interactionSelectors.js delete mode 100644 views/js/e2e/_helpers/selectors/navigationSelectors.js delete mode 100644 views/js/e2e/_helpers/selectors/runnerSelectors.js delete mode 100644 views/js/e2e/_helpers/selectors/setupSelectors.js delete mode 100644 views/js/e2e/_helpers/urls/backOfficeUrls.js delete mode 100644 views/js/e2e/_helpers/urls/runnerUrls.js delete mode 100644 views/js/e2e/deliveries/fixtures/base64LocalQtiExampleTestPackage.js delete mode 100644 views/js/e2e/deliveries/fixtures/base64RemoteQtiExampleTestPackage.js delete mode 100644 views/js/e2e/deliveries/localDeliveries.spec.js delete mode 100644 views/js/e2e/deliveries/remoteDeliveries.spec.js delete mode 100644 views/js/e2e/interactions/associate/associate.spec.js delete mode 100644 views/js/e2e/interactions/associate/fixtures/base64AssociateInteractionTestPackage.js delete mode 100644 views/js/e2e/interactions/choice/choice.spec.js delete mode 100644 views/js/e2e/interactions/choice/fixtures/base64ChoiceInteractionTestPackage.js delete mode 100644 views/js/e2e/interactions/extendedtext/extendedtext.spec.js delete mode 100644 views/js/e2e/interactions/extendedtext/fixtures/base64ExtendedTextInteractionTest.js delete mode 100644 views/js/e2e/interactions/fileupload/fileupload.spec.js delete mode 100644 views/js/e2e/interactions/fileupload/fixtures/base64FileUploadInteractionTest.js delete mode 100644 views/js/e2e/interactions/fileupload/fixtures/sample.png delete mode 100644 views/js/e2e/interactions/fileupload/fixtures/sample.zip delete mode 100644 views/js/e2e/interactions/hottext/fixtures/base64HottextInteractionTestPackage.js delete mode 100644 views/js/e2e/interactions/hottext/hottext.spec.js delete mode 100644 views/js/e2e/interactions/inline/choice.spec.js delete mode 100644 views/js/e2e/interactions/inline/fixtures/inlineChoiceInteractionTest.js delete mode 100644 views/js/e2e/interactions/inline/fixtures/inlineTextEntryInteractionTest.js delete mode 100644 views/js/e2e/interactions/inline/textEntry.spec.js delete mode 100644 views/js/e2e/interactions/match/fixtures/base64ChoiceInteractionTestPackage.js delete mode 100644 views/js/e2e/interactions/match/match.spec.js delete mode 100644 views/js/e2e/interactions/media/fixtures/base64MediaInteractionTest.js delete mode 100644 views/js/e2e/interactions/media/media.spec.js delete mode 100644 views/js/e2e/interactions/order/fixtures/orderInteractionTest.js delete mode 100644 views/js/e2e/interactions/order/order.spec.js delete mode 100644 views/js/e2e/interactions/slider/fixtures/base64SliderInteractionTest.js delete mode 100644 views/js/e2e/interactions/slider/slider.spec.js delete mode 100644 views/js/e2e/runner/navigation/fixtures/base64NavigationLinearTestPackage.js delete mode 100644 views/js/e2e/runner/navigation/fixtures/base64NavigationNonLinearTestPackage.js delete mode 100644 views/js/e2e/runner/navigation/navigation.spec.js diff --git a/views/js/e2e/_helpers/commands/cleanupCommands.js b/views/js/e2e/_helpers/commands/cleanupCommands.js deleted file mode 100644 index 9b120db1fe..0000000000 --- a/views/js/e2e/_helpers/commands/cleanupCommands.js +++ /dev/null @@ -1,86 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import backOfficeUrls from '../urls/backOfficeUrls'; -import cleanupSelectors from '../selectors/cleanupSelectors'; - -/** - * Cleanup Commands - */ -Cypress.Commands.add('deleteItem', (itemName) => { - - // Visit Tests page - cy.visit(backOfficeUrls.itemsPageUrl); - - // Wait until page gets loaded and root class gets selected - cy.wait('@editClassLabel'); - - // Select e2e example test subclass - cy.get(cleanupSelectors.itemsPage.rootItemClass).contains(itemName).click(); - - // Delete test - cy.get(cleanupSelectors.itemsPage.itemDeleteButton).click(); - - // Confirm deletion - cy.get(cleanupSelectors.common.confirmationModalOk).click(); - - // Wait until deletion finishes - cy.wait(['@deleteClass', '@editClassLabel']); -}); - -Cypress.Commands.add('deleteTest', (testName) => { - - // Visit Tests page - cy.visit(backOfficeUrls.testsPageUrl); - - // Wait until page gets loaded and root class gets selected - cy.wait('@editClassLabel'); - - // Select e2e example test subcalss - cy.get(cleanupSelectors.testsPage.rootTestClass).contains(testName).click(); - - // Delete test - cy.get(cleanupSelectors.testsPage.testDeleteButton).click(); - - // Confirm deletion - cy.get(cleanupSelectors.common.confirmationModalOk).click(); - - // Wait until deletion finishes - cy.wait('@delete'); -}); - -Cypress.Commands.add('deleteDelivery', (deliveryName) => { - - // Go to Deliveries page - cy.visit(backOfficeUrls.deliveriesPageUrl); - - // Wait until page gets loaded and root class gets selected - cy.wait('@editClassLabel'); - - // Select example delivery - cy.get(cleanupSelectors.deliveriesPage.rootDeliveryClass).contains(deliveryName).click(); - - // Delete delivery - cy.get(cleanupSelectors.deliveriesPage.deliveryDeleteButton).click(); - - // Confirm deletion - cy.get(cleanupSelectors.common.confirmationModalOk).click(); - - // Wait until deletion finishes - cy.wait('@delete'); -}); diff --git a/views/js/e2e/_helpers/commands/navigationCommands.js b/views/js/e2e/_helpers/commands/navigationCommands.js deleted file mode 100644 index ae823e4083..0000000000 --- a/views/js/e2e/_helpers/commands/navigationCommands.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import navigationSelectors from "../selectors/navigationSelectors"; - -/** - * Navigation Commands - */ -Cypress.Commands.add('nextItem', () => { - cy.log('COMMAND: nextItem'); - cy.get(navigationSelectors.testNavigation.nextItem).click(); - cy.wait(['@testRunnerMove', '@testRunnerGetItem']); -}); - -Cypress.Commands.add('previousItem', () => { - cy.log('COMMAND: previousItem'); - cy.get(navigationSelectors.testNavigation.previousItem).click(); - cy.wait(['@testRunnerMove', '@testRunnerGetItem']); -}); - -Cypress.Commands.add('skipItem', () => { - cy.log('COMMAND: skipItem'); - cy.get(navigationSelectors.testNavigation.skipItem).click(); - cy.wait(['@testRunnerSkip', '@testRunnerGetItem']); -}); - -Cypress.Commands.add('endTest', () => { - cy.log('COMMAND: endTest'); - cy.get(navigationSelectors.testNavigation.endTest).click(); - cy.wait('@testRunnerMove'); -}); - -Cypress.Commands.add('skipAndEndTest', () => { - cy.log('COMMAND: skipAndEndTest'); - cy.get(navigationSelectors.testNavigation.skipAndEndTest).click(); - cy.wait('@testRunnerSkip'); -}); - diff --git a/views/js/e2e/_helpers/commands/pointerCommands.js b/views/js/e2e/_helpers/commands/pointerCommands.js deleted file mode 100644 index d1221de88d..0000000000 --- a/views/js/e2e/_helpers/commands/pointerCommands.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * Pointer Commands - */ - -/** - * Selects the text content of passed element - * @see https://github.com/cypress-io/cypress/issues/2839#issuecomment-447012818 - */ -Cypress.Commands.add('selectText', { prevSubject: true }, (subject) => { - cy.wrap(subject) - .trigger('mousedown') - .then(($el) => { - const el = $el[0]; - const document = el.ownerDocument; - const range = document.createRange(); - range.selectNodeContents(el); - document.getSelection().removeAllRanges(range); - document.getSelection().addRange(range); - }) - .trigger('mouseup'); - - cy.document().trigger('selectionchange'); - return cy.wrap(subject); -}); - -/** - * Drags a DOM element by simulating mouse events - * @param {Object} point - * @param {Number} point.x - * @param {Number} point.y - * @param {String} [position] - Valid positions are topLeft, top, topRight, left, center, right, bottomLeft, bottom, and bottomRight - * @returns {DOMElement} - */ -Cypress.Commands.add('dragToPoint', { prevSubject: true }, (subject, point, position = 'center') => { - cy.wrap(subject) - .trigger('mousedown', position, { force: true }) - .trigger('mousemove', { force: true, pageX: point.x, pageY: point.y, clientX: point.x, clientY: point.y, view: window }) - .trigger('mouseup'); - - return cy.wrap(subject); -}); - -/** - * Asserts that subject is not clickable (covered up, offscreen...) - * @see https://stackoverflow.com/questions/52073331/assert-that-element-is-not-actionable-in-cypress - * - * Any assertions that follow this command will never be run, so make sure it is - * the last in the `it()` block (or ideally an `it()` to itself) - */ -Cypress.Commands.add("isNotActionable", { prevSubject: true }, function(subject) { - cy.once('fail', (err) => { - expect(err.message).to.include('cy.click() failed because this element'); - expect(err.message).to.include('is being covered by another element'); - }); - cy.get(subject).click({ timeout: 25 }).then(() => { - // '.then' will only fire if '.click' succeeded - throw new Error('Expected element NOT to be clickable, but click() succeeded'); - }); -}); diff --git a/views/js/e2e/_helpers/commands/setupCommands.js b/views/js/e2e/_helpers/commands/setupCommands.js deleted file mode 100644 index 59b9253fdf..0000000000 --- a/views/js/e2e/_helpers/commands/setupCommands.js +++ /dev/null @@ -1,266 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import backOfficeUrls from '../urls/backOfficeUrls'; -import setupSelectors from '../selectors/setupSelectors'; -import runnerSelectors from '../selectors/runnerSelectors'; - - -/** - * Listen to TaskQueue polling until a response matches - * @example - * pollTaskQueue({ category: 'import', status: 'completed' }, 3); - * - * @param {Object} criteria - response data parameters we are waiting for - * @param {String} [criteria.category] - category value we are waiting for - * @param {String} [criteria.status] - status value we are waiting for - * @param {Integer} [retries=5] - max number of `getAll` requests to look at before timing out - */ -const pollTaskQueue = (criteria, retries = 5) => { - // Recursive fn with a limit on depth - const awaitTaskQueue = (retries) => { - cy.wait('@taskQueueWebApiGetAll', { timeout: 20000 }).then((xhr) => { - if (xhr.response.body && xhr.response.body.data && xhr.response.body.data.length) { - cy.log(JSON.stringify(xhr.response.body.data[0])); // - if (Object.keys(criteria).every((key) => { - return criteria[key] === xhr.response.body.data[0][key]; - })) { - // Task Queue entry contains what we're looking for, woohoo - cy.log(`${JSON.stringify(criteria)} : OK`); - } - else if (retries > 0) { - awaitTaskQueue(retries - 1); - } - } - else if (retries > 0) { - awaitTaskQueue(retries - 1); - } - }); - } - // begin: - awaitTaskQueue(retries); -}; - -/** - * Archive taoTaskQueue tasks - * @returns {Promise} - */ -const archiveTasks = () => { - return cy.request({ - url: backOfficeUrls.taskQueueArchiveUrl, - headers: { - 'X-Requested-With': 'XmlHttpRequest' - } - }); -}; - -/** - * Ping taoTaskQueue via XHR - * Alias the result so it is available on this. - * @exposes {Cypress alias} isTaskQueueWorking - */ -Cypress.Commands.add('queryTaskQueue', () => { - cy.log('COMMAND: queryTaskQueue'); - - cy.request({ - url: backOfficeUrls.taskQueueGetUrl, - headers: { - 'X-Requested-With': 'XmlHttpRequest' - }, - failOnStatusCode: false // we want to process 4xx and 5xx responses too - }) - .then(xhr => { - // Set status on Cypress context - cy.wrap(xhr.status === 200).as('isTaskQueueWorking'); - }); -}); - - -/** - * Setup Commands - */ -Cypress.Commands.add('importTestPackage', function(fileContent, fileName) { - cy.log('COMMAND: importTestPackage', fileName); - - // Check if Task Queue worker is alive (stores isTaskQueueWorking property on context) - cy.queryTaskQueue(); - - // Visit Tests page - cy.visit(backOfficeUrls.testsPageUrl); - - // Wait until page gets loaded and root class gets selected - cy.wait('@editClassLabel'); - - // Select test import - cy.get(setupSelectors.testsPage.testImportButton).click(); - - // Wait until test import form is loaded - cy.get('@isTaskQueueWorking').then(working => { - if (working) { - archiveTasks(); - cy.wait('@taskQueueWebApiGetAll'); - } - }); - // If Task Queue is turned off, or is on but isn't working, we fall back to the synchronous import request: - cy.wait('@testImportIndex'); - - // Upload example qti test file to file input - // force:true needed because of a known issue (https://github.com/abramenal/cypress-file-upload/issues/34) - cy.get(setupSelectors.testsPage.fileInput).upload( - { - fileContent, - fileName: `${fileName}.zip`, - mimeType: 'application/zip', - encoding: 'base64' - }, - { - subjectType: 'input', - force: true - } - ); - cy.wait('@fileUpload'); - - // Import selected test file - cy.get(setupSelectors.testsPage.fileImportButton).click(); - - /* - * Two different processes to handle different UX - * for taoTaskQueue enabled or disabled - */ - cy.get('@isTaskQueueWorking').then(working => { - if (working) { - cy.wait(Array(4).fill('@taskQueueWebApi'), { timeout: 20000 }); - - pollTaskQueue({ category: 'import', status: 'completed' }); - - archiveTasks(); - } - else { - // Wait until test import request finishes - cy.wait(['@testImportIndex', '@taskQueueWebApi', '@taskQueueWebApi'], { timeout: 20000 }); - - // Continue - cy.get(setupSelectors.testsPage.feedbackContinueButton).click(); - - // Wait until publish button appears again - cy.wait('@editTest'); - } - }) -}); - -Cypress.Commands.add('publishTest', function(testName, deliveryType = 'local') { - cy.log('COMMAND: publishTest', testName, deliveryType); - - // Check if Task Queue worker is alive (stores isTaskQueueWorking property on context) - cy.queryTaskQueue(); - - // Visit Tests page - cy.visit(backOfficeUrls.testsPageUrl); - - // Wait until page gets loaded and root class gets selected - cy.wait('@editClassLabel'); - - // Select tree node - cy.get(setupSelectors.testsPage.rootTestClass).within(() => { - // using 'force: true' because the list item can be off screen - cy.contains(testName).click({ force: true }); - }); - - cy.wait('@editTest'); - - // Publish selected test - cy.get(setupSelectors.testsPage.testPublishButton).click(); - - const tenantLabel = Cypress.env('deliverTenantLabel'); - - if (deliveryType === 'remote' && tenantLabel && tenantLabel.length) { - // Select TAO Remote tab - cy.get(setupSelectors.testsPage.deliveryTypeTabs).contains('TAO Remote').click(); - // Select suitable tenant - cy.get('.deliver-tenant-list').select(tenantLabel); - } - - // Select Assembled Delivery as root class for publishing - cy.get(setupSelectors.testsPage.destinationSelector).contains('Assembled Delivery').click(); - - // Clicking on publish - cy.get(setupSelectors.testsPage.destinationSelectorActions).contains('Publish').click(); - - // Wait until test is published - if (deliveryType === 'remote') { - cy.wait('@publishDeliverConnect'); - } - else { - cy.wait('@publishDeliveryRdf'); - } - /* - * Two different processes to handle different UX - * for taoTaskQueue enabled or disabled - */ - cy.get('@isTaskQueueWorking').then(working => { - if (working) { - cy.wait('@taskQueueWebApi', { timeout: 20000 }); // can be 1-4 of them :( - - if (deliveryType === 'remote') { - pollTaskQueue({ taskLabel: 'Remote Publication Lookup', status: 'completed' }); - } - archiveTasks(); - } - else { - cy.wait('@editTest'); - } - }); -}); - -Cypress.Commands.add('setDeliveryForGuests', (testName) => { - cy.log('COMMAND: setDeliveryForGuests', testName); - - // Go to Deliveries page - cy.visit(backOfficeUrls.deliveriesPageUrl); - - // Wait until page gets loaded and root class gets selected - cy.wait('@editClassLabel'); - - // Select example delivery - cy.get(setupSelectors.deliveriesPage.rootDeliveryClass).contains(testName).click(); - - // Set guest access on the delivery (if not yet enabled) - cy.get(setupSelectors.deliveriesPage.guestAccessCheckbox).check(); - - // Save delivery - cy.get(setupSelectors.deliveriesPage.formContainer).contains('Save').click(); - - // Wait until save happened properly - // Not ideal but these requests have to be waited in this order upon delivery save - cy.wait(['@editDelivery', '@getData','@editDelivery', '@getData', '@editDelivery' ]); -}); - -Cypress.Commands.add('startTest', (testName) => { - cy.log('COMMAND: startTest', testName); - - // Wait for attachment of event listeners to links - cy.wait(2000); - - cy.get(runnerSelectors.testList) - .find(runnerSelectors.availableDeliveries) - .contains(`Delivery of ${testName}`) - .click(); - - // The test should be launching now, but it can take several seconds - cy.wait(['@testRunnerInit', '@testRunnerGetItem'], {timeout: 10000}); -}); diff --git a/views/js/e2e/_helpers/routes/backOfficeRoutes.js b/views/js/e2e/_helpers/routes/backOfficeRoutes.js deleted file mode 100644 index 90695eb281..0000000000 --- a/views/js/e2e/_helpers/routes/backOfficeRoutes.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * Add routes for back office - */ -Cypress.Commands.add('addBackOfficeRoutes', () => { - - // Register routes for test actions - cy.route('POST', '**/editTest').as('editTest'); - cy.route('POST', 'taoTests/TestImport/index').as('testImportIndex'); - cy.route('POST', 'tao/File/upload').as('fileUpload'); - cy.route('GET', /tao\/TaskQueueWebApi\/get\?/).as('taskQueueWebApi'); - cy.route('GET', /tao\/TaskQueueWebApi\/getAll\?/).as('taskQueueWebApiGetAll'); - cy.route('POST', 'taoDeliveryRdf/Publish/publish').as('publishDeliveryRdf'); - cy.route('POST', 'taoDeliverConnect/PublishDelivery/submitFromTests').as('publishDeliverConnect'); - - // Register routes for delivery actions - cy.route('POST', '**/editDelivery').as('editDelivery'); - - // Register routes for common actions - cy.route('POST', '**/editClassLabel').as('editClassLabel'); - cy.route('POST', '**/delete').as('delete'); - cy.route('POST', '**/deleteClass').as('deleteClass'); - cy.route('POST', '/tao/GenerisTree/getData').as('getData'); -}); diff --git a/views/js/e2e/_helpers/routes/runnerRoutes.js b/views/js/e2e/_helpers/routes/runnerRoutes.js deleted file mode 100644 index 375aeb47ae..0000000000 --- a/views/js/e2e/_helpers/routes/runnerRoutes.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * Add routes for the runner - */ -Cypress.Commands.add('addRunnerRoutes', () => { - // Register test runner routes - cy.route('POST', /\/taoQtiTest\/Runner\/init\?\S+/).as('testRunnerInit'); - cy.route('POST', /\/taoQtiTest\/Runner\/move\?\S+/).as('testRunnerMove'); - cy.route('POST', /\/taoQtiTest\/Runner\/skip\?\S+/).as('testRunnerSkip'); - cy.route('GET', /\/taoQtiTest\/Runner\/getItem\?\S+/).as('testRunnerGetItem'); - cy.route('POST', /\/taoQtiTest\/Runner\/comment\?\S+/).as('comment'); -}); diff --git a/views/js/e2e/_helpers/selectors/cleanupSelectors.js b/views/js/e2e/_helpers/selectors/cleanupSelectors.js deleted file mode 100644 index 61cbe33869..0000000000 --- a/views/js/e2e/_helpers/selectors/cleanupSelectors.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * CSS Selectors for setup cleaning - */ -export default { - testsPage: { - testDeleteButton: '#test-delete', - rootTestClass: 'li[data-uri="http://www.tao.lu/Ontologies/TAOTest.rdf#Test"]' - }, - deliveriesPage: { - rootDeliveryClass: 'li[data-uri="http://www.tao.lu/Ontologies/TAODelivery.rdf#AssembledDelivery"]', - deliveryDeleteButton: '#delivery-delete' - }, - itemsPage: { - rootItemClass: 'li[data-uri="http://www.tao.lu/Ontologies/TAOItem.rdf#Item"]', - itemDeleteButton: '#item-class-delete' - }, - common: { - confirmationModalOk: '.preview-modal-feedback button[data-control="ok"]' - } -}; diff --git a/views/js/e2e/_helpers/selectors/interactionSelectors.js b/views/js/e2e/_helpers/selectors/interactionSelectors.js deleted file mode 100644 index 46bbd96588..0000000000 --- a/views/js/e2e/_helpers/selectors/interactionSelectors.js +++ /dev/null @@ -1,88 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * CSS Selectors for interactions - */ -export default { - commonInteractionSelectors: { - interaction: '.qti-interaction', - qtiChoice: '.qti-choice', - choiceArea: '.choice-area', - resultArea: '.result-area', - itemInstruction: '.item-instruction', - checkboxIcon: '.icon-checkbox', - checkboxChecked: 'input[type="checkbox"]:checked', - qtiOrder: '.qti-orderInteraction' - }, - matchInteractionSelectors: { - interactionArea: '.match-interaction-area' - }, - orderInteractionSelectors: { - addToSelection: 'span.icon-add-to-selection', - removeFromSelection: 'span.icon-remove-from-selection', - moveBefore: 'span.icon-move-before', - moveAfter: 'span.icon-move-after' - }, - sliderInteractionSelectors: { - sliderHandle: '.noUi-handle-lower', - sliderBar: '.noUi-origin', - labels: '.qti-slider-values', - minLabel: '.slider-min', - maxLabel: '.slider-max', - currentValue: 'span.qti-slider-cur-value' - }, - extendedTextInteractionSelectors: { - textContainer: '.text-container', - countChars: '.count-chars' - }, - fileUploadInteractionSelectors: { - fileUploadInput: '.file-upload input[type="file"]', - fileUploadPreview: '.file-upload-preview', - progressBar: '.progressbar' - }, - mediaInteractionSelectors: { - mediaPlayer: '.mediaplayer', - video: '.video', - playButton: '.playback [data-control="play"]', - pauseButton: '.playback [data-control="pause"]', - overlayPlayButton: '.overlay [data-control="play"]', - overlayPauseButton: '.overlay [data-control="pause"]', - muteSound: '.sound [data-control="mute"]', - unmuteSound: '.sound [data-control="unmute"]', - currentTime: '[data-control="time-cur"]', - durationTime: '[data-control="time-end"]', - seekSliderBar: '.seek .noUi-origin', - seekSliderHandle: '.seek .noUi-handle-lower', - volumeSliderBar: '.volume .noUi-base', // - volumeSliderHandle: '.volume .noUi-handle-upper', - volumeSliderPosition: '.volume .noUi-origin.noUi-connect', // - }, - inlineInteractionSelectors: { - choiceDropdown: 'div.qti-inlineChoiceInteraction', - choiceOption: '.select2-result-label', - choosenOption: '.select2-chosen', - textEntry: '.qti-textEntryInteraction' - }, - itemInstructionFeedback: { - info: 'feedback-info', - warning: 'feedback-warning', - success: 'feedback-success', - error: 'feedback-error' - } -}; diff --git a/views/js/e2e/_helpers/selectors/navigationSelectors.js b/views/js/e2e/_helpers/selectors/navigationSelectors.js deleted file mode 100644 index ee6db5bdf6..0000000000 --- a/views/js/e2e/_helpers/selectors/navigationSelectors.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * CSS Selectors for navigation - */ -export default { - testNavigation: { - nextItem: '[data-control="move-forward"]', - previousItem: '[data-control="move-backward"]', - skipItem: '[data-control="skip"]', - endTest: '[data-control="move-end"]', - skipAndEndTest: '[data-control="skip-end"]', - } -}; diff --git a/views/js/e2e/_helpers/selectors/runnerSelectors.js b/views/js/e2e/_helpers/selectors/runnerSelectors.js deleted file mode 100644 index 45cd64b0bf..0000000000 --- a/views/js/e2e/_helpers/selectors/runnerSelectors.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * CSS Selectors for the test runner - */ -export default { - testList: '.test-listing', - availableDeliveries: '.entry-point-all-deliveries' -}; \ No newline at end of file diff --git a/views/js/e2e/_helpers/selectors/setupSelectors.js b/views/js/e2e/_helpers/selectors/setupSelectors.js deleted file mode 100644 index d4e7de50af..0000000000 --- a/views/js/e2e/_helpers/selectors/setupSelectors.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * CSS Selectors for setup - */ -export default { - testsPage: { - rootTestClass:'li[data-uri="http://www.tao.lu/Ontologies/TAOTest.rdf#Test"]', - testImportButton: '#test-import', - fileInput: '.main-container .file-uploader input[type="file"]', - fileImportButton: '.content-block .form-toolbar button[title="Import"]', - feedbackContinueButton: '.feedback-success button[title="continue"]', - testPublishButton: '#test-publish', - destinationSelector: '.destination-selector', - destinationSelectorActions: '.destination-selector .actions', - deliveryTypeTabs: '.tab-group.rendered' - }, - deliveriesPage: { - rootDeliveryClass: 'li[data-uri="http://www.tao.lu/Ontologies/TAODelivery.rdf#AssembledDelivery"]', - formContainer: '#form-container', - guestAccessCheckbox: '#form-container input[name="http_2_www_0_tao_0_lu_1_Ontologies_1_TAODelivery_0_rdf_3_AccessSettings_0"]' - } -}; diff --git a/views/js/e2e/_helpers/urls/backOfficeUrls.js b/views/js/e2e/_helpers/urls/backOfficeUrls.js deleted file mode 100644 index 8df910e36d..0000000000 --- a/views/js/e2e/_helpers/urls/backOfficeUrls.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * Urls for back office - */ -export default { - itemsPageUrl: 'tao/Main/index?structure=items&ext=taoItems§ion=manage_items&uri=http%3A%2F%2Fwww.tao.lu%2FOntologies%2FTAOItem.rdf%23Item', - testsPageUrl: 'tao/Main/index?structure=tests&ext=taoTests§ion=manage_tests&uri=http%3A%2F%2Fwww.tao.lu%2FOntologies%2FTAOTest.rdf%23Test', - deliveriesPageUrl: 'tao/Main/index?structure=delivery&ext=taoDeliveryRdf§ion=manage_delivery_assembly&uri=http%3A%2F%2Fwww.tao.lu%2FOntologies%2FTAODelivery.rdf%23AssembledDelivery', - taskQueueArchiveUrl: 'tao/TaskQueueWebApi/archive?taskId=all', - taskQueueGetUrl: 'tao/TaskQueueWebApi/get' -}; diff --git a/views/js/e2e/_helpers/urls/runnerUrls.js b/views/js/e2e/_helpers/urls/runnerUrls.js deleted file mode 100644 index 014b250ed0..0000000000 --- a/views/js/e2e/_helpers/urls/runnerUrls.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * Urls for the test runner - */ -export default { - availableDeliveriesPageUrl: '/taoDelivery/DeliveryServer/index' -}; diff --git a/views/js/e2e/deliveries/fixtures/base64LocalQtiExampleTestPackage.js b/views/js/e2e/deliveries/fixtures/base64LocalQtiExampleTestPackage.js deleted file mode 100644 index 81cdbfbe87..0000000000 --- a/views/js/e2e/deliveries/fixtures/base64LocalQtiExampleTestPackage.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * QTI test package with one block interaction - */ -const base64Test = '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'; - -export default base64Test; \ No newline at end of file diff --git a/views/js/e2e/deliveries/fixtures/base64RemoteQtiExampleTestPackage.js b/views/js/e2e/deliveries/fixtures/base64RemoteQtiExampleTestPackage.js deleted file mode 100644 index 91aa723678..0000000000 --- a/views/js/e2e/deliveries/fixtures/base64RemoteQtiExampleTestPackage.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * QTI test package with one block interaction - */ -const base64Test = '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'; - -export default base64Test; \ No newline at end of file diff --git a/views/js/e2e/deliveries/localDeliveries.spec.js b/views/js/e2e/deliveries/localDeliveries.spec.js deleted file mode 100644 index 1141e384d9..0000000000 --- a/views/js/e2e/deliveries/localDeliveries.spec.js +++ /dev/null @@ -1,72 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import runnerSelectors from '../_helpers/selectors/runnerSelectors'; - -import '../_helpers/commands/setupCommands'; -import '../_helpers/commands/cleanupCommands'; -import '../_helpers/routes/backOfficeRoutes'; - -import base64Test from './fixtures/base64LocalQtiExampleTestPackage'; - -describe('Local deliveries', () => { - - const testTitle = 'e2e local example test'; - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Admin login - * - Import and publish e2e example test - * - Set guest access on delivery and save - * - Logout - * - Guest login - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64Test, testTitle); - cy.publishTest(testTitle, 'local'); - cy.setDeliveryForGuests(testTitle); - cy.logout(); - cy.guestLogin(); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.guestLogout(); - cy.login('admin'); - cy.deleteItem(testTitle); - cy.deleteTest(testTitle); - cy.deleteDelivery(`Delivery of ${testTitle}`); - }); - - /** - * Delivery tests - */ - describe('Delivery list', () => { - - it('List contains local example e2e delivery', function() { - cy.get(runnerSelectors.testList).find(runnerSelectors.availableDeliveries).contains(`Delivery of ${testTitle}`); - }); - }); -}); diff --git a/views/js/e2e/deliveries/remoteDeliveries.spec.js b/views/js/e2e/deliveries/remoteDeliveries.spec.js deleted file mode 100644 index 170e532be6..0000000000 --- a/views/js/e2e/deliveries/remoteDeliveries.spec.js +++ /dev/null @@ -1,133 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import '../_helpers/commands/setupCommands'; -import '../_helpers/commands/cleanupCommands'; -import '../_helpers/routes/backOfficeRoutes'; - -import base64Test from './fixtures/base64RemoteQtiExampleTestPackage'; - -describe('Remote deliveries', () => { - - const testTitle = 'e2e remote example test'; - let deliveryId; - - const ltiCall = (ltiConfig = {}) => { - const ltiDefaultConfig = { - key: 'key', - secret: 'secret', - lti_message_type: 'basic-lti-launch-request', - lti_version: 'LTI-1p0', - oauth_consumer_key: 'anything', - resource_link_id: 'something', - roles: 'Learner', - user_id: '12345' - }; - // Initiate LTI call to the provider TAO, with deliveryId - cy.visit({ - url: `${Cypress.env('taoDeliverBackendUrl')}/api/v1/auth/launch-lti/${deliveryId}`, - method: 'POST', - form: true, - body: {...ltiDefaultConfig, ...ltiConfig} - }); - }; - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Admin login - * - Import and publish e2e example test - * - Set guest access on delivery and save - * - Logout - * - Guest login - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64Test, testTitle); - cy.publishTest(testTitle, 'remote'); - cy.setDeliveryForGuests(testTitle); - // Extract the published delivery id, we'll need it for LTI call - cy.get('#http_2_www_0_tao_0_lu_1_Ontologies_1_taoDeliverConnect_0_rdf_3_PublishedDeliveryId') - .then(els => { - deliveryId = els[0].value; - cy.log(deliveryId); - }); - cy.logout(); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem(testTitle); - cy.deleteTest(testTitle); - cy.deleteDelivery(testTitle); - }); - - /** - * Delivery tests - */ - describe('Publish and access remote delivery', () => { - - it('Delivery can be reached through LTI call', function() { - ltiCall(); - }); - - it('Delivery can be taken', function() { - cy.get('.title-box').contains(testTitle); - cy.get('[data-control="move-end"]'); - cy.get('[data-control="skip-end"]'); - }); - - it('Delivery shows its thank you page on completion', function() { - cy.get('[data-control="move-end"]').click(); - - cy.location().should(loc => { - expect(loc.origin).to.eq(Cypress.env('taoDeliverFrontendUrl')); - expect(loc.pathname).to.eq('/thank-you') - }); - }); - }); - - describe('Publish and access remote delivery', () => { - - it('Delivery can be reached through LTI call (return URL specified)', function() { - ltiCall({ launch_presentation_return_url: Cypress.env('baseUrl') }) - }); - - it('Delivery can be taken', function() { - cy.get('.title-box').contains(testTitle); - cy.get('[data-control="move-end"]'); - cy.get('[data-control="skip-end"]'); - }); - - it('Delivery redirects to returnURL on completion', function() { - cy.get('[data-control="move-end"]').click(); - - cy.location().should(loc => { - expect(loc.origin).to.eq(Cypress.env('baseUrl')); - }); - }); - }); -}); diff --git a/views/js/e2e/interactions/associate/associate.spec.js b/views/js/e2e/interactions/associate/associate.spec.js deleted file mode 100644 index b08157fe7d..0000000000 --- a/views/js/e2e/interactions/associate/associate.spec.js +++ /dev/null @@ -1,113 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import {commonInteractionSelectors} from '../../_helpers/selectors/interactionSelectors'; - -import '../../_helpers/commands/setupCommands'; -import '../../_helpers/commands/cleanupCommands'; -import '../../_helpers/routes/backOfficeRoutes'; -import '../../_helpers/routes/runnerRoutes'; - -import base64Test from './fixtures/base64AssociateInteractionTestPackage'; - -describe('Interactions', () => { - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Admin login - * - Import test package - * - Publish imported test as a delivery - * - Set guest access on delivery and save - * - Logout - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64Test, 'associate'); - cy.publishTest('associate'); - cy.setDeliveryForGuests('Delivery of associate'); - cy.logout(); - }); - - /** - * Log in & start the test - */ - beforeEach(() => { - cy.setupServer(); - cy.addRunnerRoutes(); - cy.guestLogin(); - cy.startTest('associate'); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem('associate'); - cy.deleteTest('associate'); - cy.deleteDelivery('Delivery of associate'); - }); - - /** - * Interaction tests - */ - describe('Associate interaction', () => { - it('Loads in proper state', function () { - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(commonInteractionSelectors.choiceArea).should('exist'); - cy.get('.qti-choice').should('have.length', 4); - - cy.get(commonInteractionSelectors.resultArea).should('exist'); - cy.get('.target.lft.filled.active').should('have.length', 0); - }); - }); - - it.skip('Add item to resultArea', function () { - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get('.qti-choice[data-identifier=choice_1]').click(); - cy.get('.qti-choice[data-identifier=choice_1]').should('have.class', 'active'); - cy.get('.qti-choice').should('have.length', 3); - - cy.get('.target').eq(0).click(); - cy.get('.target.lft.filled.active').should('have.length', 1); - }); - }); - - it.skip('Remove item from resultArea', function () { - }); - - it.skip('Cannot create same association', function () { - }); - - it.skip('Removing left association makes row disappear', function () { - }); - - it.skip('Cannot create association because max amount is reached', function () { - }); - - it.skip('Interaction keeps state', function () { - }); - - }); -}); diff --git a/views/js/e2e/interactions/associate/fixtures/base64AssociateInteractionTestPackage.js b/views/js/e2e/interactions/associate/fixtures/base64AssociateInteractionTestPackage.js deleted file mode 100644 index 16e6c7bb98..0000000000 --- a/views/js/e2e/interactions/associate/fixtures/base64AssociateInteractionTestPackage.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * QTI test package with: - * - single item - * - single choice interaction - * - tools enabled: none - */ -export default 'UEsDBBQAAAAAABCIG0/AjIZgEgAAABIAAAA5AAAAaXRlbXMvaTE1NjY5MjE4MjYyMzQ4NjU5L3N0eWxlL2N1c3RvbS90YW8tdXNlci1zdHlsZXMuY3NzIC8qIERvIG5vdCBlZGl0ICovUEsDBBQAAAAIABCIG08W/RrB4QMAALAQAAAgAAAAaXRlbXMvaTE1NjY5MjE4MjYyMzQ4NjU5L3F0aS54bWztWFtz2jgUfs+v0PodhE1CIWPo0KQ7m9mQdALpdqfTyQhZYM3q4pVkIP++xwYbzLpNQsg+9QHGOjqX71x9IHy/kgItmLFcq77nN1seYorqiKt537uf/N7oeu8HJyGxllkrmXJXjkkEQsr2vdi55Bzj5XLZ5NLOhZ4S0dRmjlc2wkD51/GHRZAE3lrgXFZElu2c1+/1unhEXJx/ja4L5pXldexBq+XjL6PrMY2ZJA2urCOKMpCy/NzmxGtNicv9eS5A9FNG4Mo+GeOuUBPuPMQjCAqfcWb6HvfPOp1e4HeDTtA+7XbOeh5y3AnW9yCAmnLiAKggUyYqFHD4XJAs4kw17sceIhFJwCDIzYiwLNMi2SVLmMqsbalaixsigW0yvF0fPxepbDfbzVbDJoYr57d63uAEodAwm2hlQRUVxORBqjhw93H86fZm/NFDlBioASK4e+x7MhWOJwIsTollk8cELCaEm1wpqKXaGEbd3Ub7mgr0BREpG4S/fb24HE6GX2msOWUPPto8BN++DUK8Zvq5SLsQOd0XCXGN8RDXOPqiADz4bxqCbuFP59kheFeInL1cpPPKqOnUUS1/GLTxxe3dfslYGCDVaM2EJs5DShtJxIisuExhHgQefo6J0fDLS6xsvIzYjEDePtfEKtiLxz5riP+LKKdb9yiYjRlzKDZsBhgyAqapdVpiR3Qjtcw01mxNai30ZY7MsZXD+VmyiBMYAEKU42ETBQ7D9YOOHgv8fIHAuoVROzc8ahi99Eo/di6pFg0/KK/gshwuV8oxQ2ge0CK9V7Udb+N0NhPbkSPJarjRAsI2SxWSXO3TtkbBbGK0TNwABjmNkYsZotxxZtGSuzg3DyUHYw1RnSpnspsGElyC2xEiO4pDvNG0q9xyCQ24sT8V7CIv7kqZFBPGQzO+YlHpi4318g9ghGzBU+YbAIQa7Hut4sBVdhjcsCX6W5t/Qlxv7kBEweGI7sfDI4NpHw7mWqtIqyPjOX1FcP58GkuI67qh7CMMjVROgfLxf2y9rFyfbL5WTfO1apuv4GF5AxLFYdyuGzA7Gz6PYXKRKXfEQfel6g367+wVBUZUdOTy6hyO5i8IozkynHeHwxkzIo6Mpns4mkstkpgfexj0Dgc0SQ28TN9iIIR4981cbpGfjKbwswiWkA1/cXEBY5JXlJYDYLaDI0dfidOCmBxy/VaOK7ybFe5J1hDv2Qktc7fr7Sbfd2qWuWryUrl7/hHMtSTeY81Ws7WV7ZIGP0nYnMHu7Ie4vK+YxBWbcKwi3uZqP65byl4O3jg3MMSfn50q86/87JJ3eypv1J3/HQYn3wFQSwMEFAAAAAgAEIgbT2jdenr1AQAAVQUAACEAAAB0ZXN0cy9pMTU2NjkyNTE5ODUxMDc2NjAvdGVzdC54bWzVVMGK2zAQve9XCN1jxU43JCHJUhYWCtlS4rT0VhR7kgyRJa9HsfP5Hdnxdt2F0uuCffDTG82b5yctH66FETVUhM6uZByNpQCbuRztcSW/755GM/mwvltqIiAqwPodkBdcZGklT96XC6WapomwoKNxe20iVx3VlXLFyIvHX3VSJrIrWFwJB0XNpGUn43Gsfj5v0uwEhR6hJa9tBlJgzg3xgFCtJCtwGWrPsEdvYIg4Z77qgkGvXff5o59pEk2i8YjKCq2Px3PWQrigttXGZdq3pP+dRPyTyKzwBuLbojKOeFWu74RYeixggwV6EtoY12xYf3rZF0id2oM2BFJ1XLb6m678wIceHMVSWF3jsZ3g2eU8vEELupKCXjfscLQ51phftGlF8NbooUihpTw66ytnRKGvnz3Dpec/yzGgk2ueAPK9zs69rk7zFmqEhqVUF+h4qTMX/0Z/x3t0RUjMEEzPWJZturryWhvM2YQtUOksp2zgAUv9E70UstDk71gMV4MvFbxcsIK873HAa/i4ybjFp9+N+TUS7gPW0c8A5c4dwZ9awwPWaflQxg2s+8L6tnAYWBdGGbp1aze061TBYSWjSPETSkhhfD+dzpN4lkyTyafZ9H4eUh/xGX/16aM5pd5ZdUufehew9miq/hjy3aiGl+P67jdQSwMEFAAAAAgAEIgbTwKzJGdHAgAAjQcAAA8AAABpbXNtYW5pZmVzdC54bWztVV2PmkAUfd9fQabPMDAKqwbZ9KFNNtF2G23SNzPCVScFhjLjV399LyAsqLv60j7VxMicuR+He86M/tMhiY0d5ErIdEwcyyZPwYOf8FSsQGkDd1M1JhutsxGl+/3eEolax3LJY0vma3pQEUUkzBY7J3NIFT86KNHJ2ffKYGbbDv0xnczCDSTcFKnSPA0Bs5QYqRKcyJDrksqdLY13435pUXx3LGP176LMxVRW5NsWhtU1Yq1CSwBAkz/5OjVuEUmiRSylgqJcL2N/pSAxRASpFisB+Zh8mz+b80+zuTn9+OX5c/GguXQjz/Wcpc1czm1mPro9xob9fi1JWbeZ6lViJHgw8OMnoHnENa+WJVSJE2DjHbOY8cLDn3wNPj3h54EnPwVoJ8uuo2qwakK7XXzkgZ77XYqv6AnMQcltHoJ67dDBO1MRjut5Q+YMmMd6/YHnDomhjxngTqJQ/IXQkCxwGoULiLHJYYVbiCl6mVq4xcJYcta5Ye2XAx3FMqkfw5grhVwqA9eo5geZvnC9qYGKebPSuUjXhUajmKfrMYHU/D4jwdXDY1M8P3m0MquBfoj5EmKftisFzbLTpmRRL3Bk+fEWAXwXGQqu4Y36pyK0U59evDO9Phvamt6rE/yViOFeYWhXmY5K99RR+hgDDbdKy4Ti+TG3CnKzRJUVKvVWA5/W7gve9aHrDAeuYz96nn3mQ40X67kPC6yh2UqlxUZlxP/e+1feuy0GDfwIMkhR9vDYUr+y3OVFhPEt29DWvYYUTv+1wcMfUEsBAhQDFAAAAAAAEIgbT8CMhmASAAAAEgAAADkAAAAAAAAAAAAAALaBAAAAAGl0ZW1zL2kxNTY2OTIxODI2MjM0ODY1OS9zdHlsZS9jdXN0b20vdGFvLXVzZXItc3R5bGVzLmNzc1BLAQIUAxQAAAAIABCIG08W/RrB4QMAALAQAAAgAAAAAAAAAAAAAAC2gWkAAABpdGVtcy9pMTU2NjkyMTgyNjIzNDg2NTkvcXRpLnhtbFBLAQIUAxQAAAAIABCIG09o3Xp69QEAAFUFAAAhAAAAAAAAAAAAAAC2gYgEAAB0ZXN0cy9pMTU2NjkyNTE5ODUxMDc2NjAvdGVzdC54bWxQSwECFAMUAAAACAAQiBtPArMkZ0cCAACNBwAADwAAAAAAAAAAAAAAtoG8BgAAaW1zbWFuaWZlc3QueG1sUEsFBgAAAAAEAAQAQQEAADAJAAAAAA=='; diff --git a/views/js/e2e/interactions/choice/choice.spec.js b/views/js/e2e/interactions/choice/choice.spec.js deleted file mode 100644 index 34bfed939b..0000000000 --- a/views/js/e2e/interactions/choice/choice.spec.js +++ /dev/null @@ -1,128 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import {commonInteractionSelectors} from '../../_helpers/selectors/interactionSelectors'; - -import '../../_helpers/commands/setupCommands'; -import '../../_helpers/commands/cleanupCommands'; -import '../../_helpers/commands/navigationCommands'; -import '../../_helpers/routes/backOfficeRoutes'; -import '../../_helpers/routes/runnerRoutes'; - -import base64Test from './fixtures/base64ChoiceInteractionTestPackage'; - -describe('Interactions', () => { - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Admin login - * - Import test package - * - Publish imported test as a delivery - * - Set guest access on delivery and save - * - Logout - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64Test, 'e2e choice interaction test'); - cy.publishTest('e2e choice interaction test'); - cy.setDeliveryForGuests('Delivery of e2e choice interaction test'); - cy.logout(); - }); - - /** - * Log in & start the test - */ - beforeEach(() => { - cy.setupServer(); - cy.addRunnerRoutes(); - cy.guestLogin(); - cy.startTest('e2e choice interaction test'); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem('e2e choice interaction test'); - cy.deleteTest('e2e choice interaction test'); - cy.deleteDelivery('Delivery of e2e choice interaction test'); - }); - - /** - * Tools tests - */ - describe('Choice interaction', () => { - it('Choice item gets selected on click', function () { - cy.get(commonInteractionSelectors.choiceArea).within(() => { - cy.get(commonInteractionSelectors.qtiChoice).first().click(); - cy.get(commonInteractionSelectors.qtiChoice).first().should('have.class', 'user-selected'); - }); - }); - - it('Should not allow multiple selection if disabled', function () { - cy.get(commonInteractionSelectors.interaction).first().within(() => { - cy.get(commonInteractionSelectors.qtiChoice).first().click(); - cy.get(commonInteractionSelectors.qtiChoice).first().next().click(); - cy.get(commonInteractionSelectors.qtiChoice).first().should('not.have.class', 'user-selected'); - cy.get(commonInteractionSelectors.qtiChoice).first().next().should('have.class', 'user-selected'); - - }); - }); - - it('Should allow multiple selection if enabled', function () { - cy.get(commonInteractionSelectors.interaction).eq(1).within(() => { - cy.get(commonInteractionSelectors.qtiChoice).first().click(); - cy.get(commonInteractionSelectors.qtiChoice).first().next().click(); - cy.get(commonInteractionSelectors.qtiChoice).first().should('have.class', 'user-selected'); - cy.get(commonInteractionSelectors.qtiChoice).first().next().should('have.class', 'user-selected'); - - }); - }); - - it('Interaction keeps state', function () { - cy.get(commonInteractionSelectors.interaction).first().within(() => { - cy.get(commonInteractionSelectors.qtiChoice).first().click(); - }); - - cy.get(commonInteractionSelectors.interaction).eq(1).within(() => { - cy.get(commonInteractionSelectors.qtiChoice).first().click(); - cy.get(commonInteractionSelectors.qtiChoice).first().next().click(); - }); - - cy.nextItem(); - cy.previousItem(); - - cy.get(commonInteractionSelectors.interaction).first().within(() => { - cy.get(commonInteractionSelectors.qtiChoice).first().should('have.class', 'user-selected'); - }); - - cy.get(commonInteractionSelectors.interaction).eq(1).within(() => { - cy.get(commonInteractionSelectors.qtiChoice).first().should('have.class', 'user-selected'); - cy.get(commonInteractionSelectors.qtiChoice).first().next().should('have.class', 'user-selected'); - }); - - }); - }); -}); diff --git a/views/js/e2e/interactions/choice/fixtures/base64ChoiceInteractionTestPackage.js b/views/js/e2e/interactions/choice/fixtures/base64ChoiceInteractionTestPackage.js deleted file mode 100644 index 70a7bb051b..0000000000 --- a/views/js/e2e/interactions/choice/fixtures/base64ChoiceInteractionTestPackage.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * QTI test package with: - * - single item - * - single choice interaction - * - tools enabled: none - */ -export default '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'; diff --git a/views/js/e2e/interactions/extendedtext/extendedtext.spec.js b/views/js/e2e/interactions/extendedtext/extendedtext.spec.js deleted file mode 100644 index b92ed39fce..0000000000 --- a/views/js/e2e/interactions/extendedtext/extendedtext.spec.js +++ /dev/null @@ -1,138 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import { - commonInteractionSelectors, - extendedTextInteractionSelectors -} from '../../_helpers/selectors/interactionSelectors'; - -import '../../_helpers/commands/setupCommands'; -import '../../_helpers/commands/cleanupCommands'; -import '../../_helpers/commands/pointerCommands'; -import '../../_helpers/commands/navigationCommands'; - -import '../../_helpers/routes/backOfficeRoutes'; -import '../../_helpers/routes/runnerRoutes'; - -import base64Test from './fixtures/base64ExtendedTextInteractionTest'; - -describe('Interactions', () => { - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Admin login - * - Import test package - * - Publish imported test as a delivery - * - Set guest access on delivery and save - * - Logout - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64Test, 'e2e extendedtext interaction test'); - cy.publishTest('e2e extendedtext interaction test'); - cy.setDeliveryForGuests('Delivery of e2e extendedtext interaction test'); - cy.logout(); - }); - - /** - * Log in & start the test - */ - beforeEach(() => { - cy.setupServer(); - cy.addRunnerRoutes(); - cy.guestLogin(); - cy.startTest('e2e extendedtext interaction test'); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem('e2e extendedtext interaction test'); - cy.deleteTest('e2e extendedtext interaction test'); - cy.deleteDelivery('Delivery of e2e extendedtext interaction test'); - }); - - /** - * Interactions tests - */ - describe('Extended text interaction', () => { - - it('Loads in proper state', function () { - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(extendedTextInteractionSelectors.textContainer).should('exist').and('be.visible'); - cy.get(extendedTextInteractionSelectors.countChars).should('exist').and('be.visible').and('have.text', '00'); - }); - }); - - it('Counter increase when text is added', function () { - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(extendedTextInteractionSelectors.textContainer).type('Hello, World!'); - - cy.get(extendedTextInteractionSelectors.countChars).eq(0).should('have.text', 'Hello, Wor'.length.toString()); - cy.get(extendedTextInteractionSelectors.countChars).eq(1).should('have.text', 'Hello, Wor'.length.toString()); - }); - }); - - it('Counter decrease when text is deleted', function () { - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(extendedTextInteractionSelectors.textContainer).type('Hello, World!'); - cy.get(extendedTextInteractionSelectors.textContainer).type('{backspace}').type('{backspace}').type('{backspace}'); - - cy.get(extendedTextInteractionSelectors.countChars).eq(0).should('have.text', 'Hello, Wor'.slice(0, -3).length.toString()); - cy.get(extendedTextInteractionSelectors.countChars).eq(1).should('have.text', 'Hello, Wor'.slice(0, -3).length.toString()); - }); - }); - - it('Character limit reached', function () { - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(extendedTextInteractionSelectors.textContainer).type('Hello, World! Hello, World! Hello, World! Hello, World!'); - cy.get(extendedTextInteractionSelectors.textContainer).should('have.value', 'Hello, Wor'); - }); - }); - - it('Word limit reached', function () { - cy.get(commonInteractionSelectors.interaction).eq(1).within(() => { - cy.get(extendedTextInteractionSelectors.textContainer).type('Hello, World! Hello, World! Hello, World! Hello, World!'); - cy.get(extendedTextInteractionSelectors.textContainer).should('have.value', 'Hello, World!Hello,World!Hello,World!Hello,World!'); - }); - }); - - it('Interaction keeps state', function () { - cy.get(commonInteractionSelectors.interaction).within(() => { - cy.get(extendedTextInteractionSelectors.textContainer).eq(0).type('Hello Wor'); - cy.get(extendedTextInteractionSelectors.textContainer).eq(1).type('World Hello'); - }); - - cy.nextItem(); - cy.previousItem(); - - cy.get(commonInteractionSelectors.interaction).within(() => { - cy.get(extendedTextInteractionSelectors.textContainer).eq(0).should('have.value', 'Hello Wor'); - cy.get(extendedTextInteractionSelectors.textContainer).eq(1).should('have.value', 'World Hello'); - }); - }); - }); -}); diff --git a/views/js/e2e/interactions/extendedtext/fixtures/base64ExtendedTextInteractionTest.js b/views/js/e2e/interactions/extendedtext/fixtures/base64ExtendedTextInteractionTest.js deleted file mode 100644 index 0a65ca19bb..0000000000 --- a/views/js/e2e/interactions/extendedtext/fixtures/base64ExtendedTextInteractionTest.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * QTI test package - */ - -export default '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'; diff --git a/views/js/e2e/interactions/fileupload/fileupload.spec.js b/views/js/e2e/interactions/fileupload/fileupload.spec.js deleted file mode 100644 index 16683e8bd2..0000000000 --- a/views/js/e2e/interactions/fileupload/fileupload.spec.js +++ /dev/null @@ -1,197 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import {commonInteractionSelectors, fileUploadInteractionSelectors, itemInstructionFeedback} from '../../_helpers/selectors/interactionSelectors'; - -import '../../_helpers/commands/setupCommands'; -import '../../_helpers/commands/cleanupCommands'; -import '../../_helpers/commands/pointerCommands'; - -import '../../_helpers/routes/backOfficeRoutes'; -import '../../_helpers/routes/runnerRoutes'; - -import base64Test from './fixtures/base64FileUploadInteractionTest'; - -describe('Interactions', () => { - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Admin login - * - Import test package - * - Publish imported test as a delivery - * - Set guest access on delivery and save - * - Logout - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64Test, 'e2e fileupload interaction test'); - cy.publishTest('e2e fileupload interaction test'); - cy.setDeliveryForGuests('Delivery of e2e fileupload interaction test'); - cy.logout(); - }); - - /** - * Log in & start the test - */ - beforeEach(() => { - cy.setupServer(); - cy.addRunnerRoutes(); - cy.guestLogin(); - cy.startTest('e2e fileupload interaction test'); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem('e2e fileupload interaction test'); - cy.deleteTest('e2e fileupload interaction test'); - cy.deleteDelivery('Delivery of e2e fileupload interaction test'); - }); - - /** - * Interactions tests - */ - describe('File upload interaction', () => { - - it('Loads in proper state', function () { - cy.get(commonInteractionSelectors.interaction).within(() => { - cy.get(commonInteractionSelectors.itemInstruction).should('exist').and('be.visible').and('have.class', itemInstructionFeedback.info); - cy.get(fileUploadInteractionSelectors.fileUploadInput).should('exist').and('be.visible'); - cy.get(fileUploadInteractionSelectors.fileUploadPreview).should('exist').and('be.visible'); - }); - }); - - describe('Only image files allowed to be uploaded', () => { - - it('Uploads an image file with correct mime type', function () { - // Prepare to load fixture - const fileName = 'sample.png'; - const cwd = Cypress.spec.absolute.substring(0, Cypress.spec.absolute.lastIndexOf("/")); - const absolutePathToFile = `${cwd}/fixtures/${fileName}`; - - // read file content as base64 - cy.readFile(absolutePathToFile, 'base64').then((fileContent) => { - - // upload file using the file input - cy.get(fileUploadInteractionSelectors.fileUploadInput).upload( - { - fileContent, - fileName, - mimeType: 'image/png', - encoding: 'base64' - }, - { - subjectType: 'input', - force: true - } - ); - }); - - cy.get(commonInteractionSelectors.interaction).within(() => { - // feedback updated - cy.get(commonInteractionSelectors.itemInstruction).should('have.class', itemInstructionFeedback.success); - //progress bar updated - cy.get(fileUploadInteractionSelectors.progressBar).find('span').should("have.attr", "title", "100%"); - // preview updated - cy.get(fileUploadInteractionSelectors.fileUploadPreview).find('img').should('exist').and('be.visible'); - }); - - }); - - it('Do not upload an image file with incorrect mime type', function () { - // Prepare to load fixture - const fileName = 'sample.png'; - const cwd = Cypress.spec.absolute.substring(0, Cypress.spec.absolute.lastIndexOf("/")); - const absolutePathToFile = `${cwd}/fixtures/${fileName}`; - - // read file content as base64 - cy.readFile(absolutePathToFile, 'base64').then((fileContent) => { - - // upload file using the file input - cy.get(fileUploadInteractionSelectors.fileUploadInput).upload( - { - fileContent, - fileName, - mimeType: 'application/zip', - encoding: 'base64' - }, - { - subjectType: 'input', - force: true - } - ); - }); - - cy.get(commonInteractionSelectors.interaction).within(() => { - // feedback updated - cy.get(commonInteractionSelectors.itemInstruction).should('have.class', itemInstructionFeedback.error); - //progress bar updated - cy.get(fileUploadInteractionSelectors.progressBar).find('span').should("have.attr", "title", "0%"); - // preview updated - cy.get(fileUploadInteractionSelectors.fileUploadPreview).find('img').should('not.exist'); - }); - - }); - - it('Do not upload a zip file', function () { - // Prepare to load fixture - const fileName = 'sample.zip'; - const cwd = Cypress.spec.absolute.substring(0, Cypress.spec.absolute.lastIndexOf("/")); - const absolutePathToFile = `${cwd}/fixtures/${fileName}`; - - // read file content as base64 - cy.readFile(absolutePathToFile, 'base64').then((fileContent) => { - - // upload file using the file input - cy.get(fileUploadInteractionSelectors.fileUploadInput).upload( - { - fileContent, - fileName, - mimeType: 'application/zip', - encoding: 'base64' - }, - { - subjectType: 'input', - force: true - } - ); - }); - - cy.get(commonInteractionSelectors.interaction).within(() => { - // feedback updated - cy.get(commonInteractionSelectors.itemInstruction).should('have.class', itemInstructionFeedback.error); - //progress bar updated - cy.get(fileUploadInteractionSelectors.progressBar).find('span').should("have.attr", "title", "0%"); - // preview updated - cy.get(fileUploadInteractionSelectors.fileUploadPreview).find('img').should('not.exist'); - }); - - }); - - }); - - }); -}); diff --git a/views/js/e2e/interactions/fileupload/fixtures/base64FileUploadInteractionTest.js b/views/js/e2e/interactions/fileupload/fixtures/base64FileUploadInteractionTest.js deleted file mode 100644 index c9e08f115e..0000000000 --- a/views/js/e2e/interactions/fileupload/fixtures/base64FileUploadInteractionTest.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * QTI test packages with 3 items - */ - -const base64FileUploadInteractionTest = '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'; - -export default base64FileUploadInteractionTest; diff --git a/views/js/e2e/interactions/fileupload/fixtures/sample.png b/views/js/e2e/interactions/fileupload/fixtures/sample.png deleted file mode 100644 index bcf1cadad04eee4ed1bba5aa7048d3072514507f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7354 zcmai3WmsF?vJP6bXn~@E0tE^o!GpUNEfQQpplBcjcP~<)xVx1CEmE{a3$#Fs7AO?0 z;O>6Y?|k1m=f{2S-OrP~XRrOfGqYx9?PN`2bhK1RiRg&{0060)s-hm|s*U*w5#VFa zLt}^t%;i2>35I@xv_pGaqYwZ&TciyFsODmAkI+L{+xohHLP!DtILi+DFf>f_u{a#* z0PW7HQWh-2HGI(9bBc@cH2AIfDX1&Y(~PGU`;m##8U@VKNRAL zpO!w{&j}8-Ws{KxO8SUn6u2PJ)<7Q@XIBq#A1SuK^onETKg0ZNz`r19Cn>gnIR(?y z0V*I-2%s=Xm=6vXfB;3IAc(LK6awJ|3V5_hll|GKG-nUP_}mB zdWy<_+rr#Qu{}kj-NgC%y}i9b-hv<`%AOwrg+lqk0{j93d>90uhp#Kz+K1284}zN!+83yDY&?4YW`cXtH4}14@?rPjA2KF(|F@xkfVS{|$^&VS9*7S4}w zMz|nc(HBFhxUixCSPUv41QnE5R+NW8 zpb#NBF<~fJQ4k^w7E=)WW9*ND|0ZHaK(-jJC{#!QEFdQeQ4|t^K$L{Uz;YsrP!TaP zArYvYA_V#mSIyM}ZS4w2{4x56>+m10$p6U|S3n`G(MXg&66yR;si-+SdwQTze};hy zPlQ2`KN78C#r zVg!gF+uvN<{|ePVGyZ?M{1|6!;o@iqv@_!G+LUuf|1CK?{HYIdXKPn`Od$Ad5q8#| z&S*Ai9h8GBT9W@y**QC4uzyMaqVfNivcHD^t4{wxVv7Hd`0rJRx%v0HMYv)XD+;qJ zw=JqB0RTFrnxdS(&+L{dA)4Btt+woR2i+#&50r>--Xi~ogZoX9{aGc+;E7eLCd-*D zo-*m7>=KkeWJUj;YB68F?1ep4zg& zLpynAqpHm^@b)zLHW;b8G8XtkT4pTn@cf*=wW|c59xuE5-LKn8G7##Gvc7X|jJSOx?h z&mITh5-I5x4@8qPi`n<5R-_R{POhU`Y2If+Ulkur84pVnPj#t8`C9DX0b?)1BzGIK zo)qL2%vP)>9TkP=yF49d2+>u_e7+|3>k2wy)UT-0--@|0W)N9$9h zGd4bnW1FV*E?(_<Q@4IDUzGporD4udfMJ$s=a9m2$-bmt$YP-S&FTY@R|f z3dHGe@@mkv3VgO${QHGBRzeqc!n@2ftEqi$t%7#687L)+F22TdY0kvm>&WrJ&!~;$ z`oYbYfqq8}(14FiDfS>Uv;9@iT|_*C6iqzJM^4w>c&ctf<>F{#%G;__I&ic(WK3pe zJE7knmR3;neBDw`o_v{=CROj}Jlz_q)kP#{K2sXKbf!j?pGjyCeow#=Px{Ne4LG|S zm>A9u+?i|lPn^BL|52B+`o*jz*MnKooGC;cy*wmX!F>nhqs9oEgp3y9(8QAE@GvREhosB=&PAKTX(cN&>}HoIEm{KAT>`( z8A6D^R4f)S<<(>+8xoxK&s|$2$oH-yerO{~%SfG6y?;9Wb!r~e zEWyZUVHg^o5W6;tmyqTp?D$5#noFP_vKiFu7ZK>3{sQbN)Mdt>2NV)6{ z$v47CGcDfhi7KPl=ACscI5t!vTs?iAM4YsYi`*jLo;udJIFHlrm!;|RkS42tU}6)G z^2YCS7WQmL+DLhx%akIsxZwHZZ?I8)RC?@V_C_r5Wd{YuMNLUQY~;dH_K z@i!V@Odk+^*)WYi?koFMvF|-U8Q4a5n|jBO`~*vfrw+!h!20Vm$;XWDw5u!qP}Ls* zV2v4wY{2g!E%m;O&g#k4Rj+4`5wCFzzU-+8X(7O{_F^KLui#y$-^0um9>9*|yTw@H z&#`jOtCv3WdX&-Fhn8twL)&)GT4vTN&ppa(LJsl5(KE}8G*i7MNb0oQ=n=LmCr9Lg z$=c>&#C_#3BrMig{yGjzk+x#Vj%R4_l`D`8Ust{|l}LWk8H}|_goA^QaS~koetcg3 zmR7l};&cDfr@g>87~vs z?FyV?PW7ceWsCEtFm221V|hEw3t!+Y!#Pr(SA5p9E>@k^00D^e#}Ml~^$8Ug z*UJ~{fzb&}el|b%>bQ*Wo0>8u#mGd>wo*8ij$XFn=1|X1+d+SkOcSCPd`7N4IG%$R!vv!_IYdKF|@SSgTq#?jaN|MM727!Z710>&k zUS5j-K|_s%h%4;yi-=f(4Bh6GQF@0kRlXXYB*0yMwZ%d_kF%w^xT;cZ5kz#Y6YQqC##-8c2Y}059}Z3y(6J( zp%SLL`Wi$Js5A9(Pu<&aZkIbgRoYdr0RI#L+U-o3MybxcUQF3am zGBKYU^wDbFy_T9*)9U9rvG?cj0#ZZ*G?APvJYOIC$x%pFG^pltJ>ce_1NhV?yQc=j zCy+9~g|_<&i61`WEa{?L>8WleZtJ?bz>j{&!fAEavJ5O8evB34KYDCtqLVw(i^wKi z*K;95wk(_{k(6>!S``RAqkK}4TeGS`Ct)H{m`YvdYs7RYmkgsIQ&VPR9wX3xoX>;!bX*Nxtk?qJh19cjTuIQx-8(eV z7O1zD-BdJ1&bhhNG6eMn)?ebeABhk2q4~IYq&Z+I*LBR1B)Q}7O%GJT?-AJjRM=e+ z#ETuoOJv{G%JF2zsGcaaym-+lL^J~o1AA^aZfe`N54X0uYTVpwJ|_vV2zQhr%sPDmUJc%cng3 zC3%wfyT2i4&au9}nh(l31y4-p>fuT*ZKoXnuvSYr&mKrAKcvAETOpYPL4GYruf?|f zZC^J#`yz&q2h<+&5VYmfqD;ad88}$Fe@nP*E{!~C{F-FVm-O`!u3CIY+(coJgB+03 zR)r}4=mlH9p&+c7nWRva$%>)LIOm3l5Z9BBzV6#kPq~Y_(?u#8JiD(%`T~T1&adr;w(`lq1 z*l21~eB?M>-6bMxt)L0*7~Hd7F8gZ3abqK|nc?_2`10~}x5(e<@?1$FebR98Ks-3H z-;xQ?HA}`U-GS4;Xpw*16D*Yi0e!Y>&I$VX=wr_DipOjDysF5p_v?l(fmoa*1*2SY zE$xB1J%Qbad(!xXqE!&Q{gF$i4B4~y)~+^L%2t^KUF+D^QS|~Y4`EHIb&G@Urm-v; zj&0$0V-+0Ka6^nHEsL4y<<+pek||lT9XkZ0E=)yU!!EqgwkoNgV>V{nrurUD*Iuex zwj(1!zkU7l^2zV%lSB6F>R5u`AWV0TdrAPf^{kaCVHbYd(znA;UTbEx0`HN4-XkVv zHB6g!hb05Hj_$IP`JdPaI(du5Tt_F|1P=ZrJS^ADI$}#TRdmy_ik?ot_7xx3dLt5) z^t>17WC|QR+hK1((!~WFbt&B(aWG4^TbWOQRKZ6n^&t);JYjZ1r{<#e1w z7^lJm%AvuL-;G-}9YF*T9M8u-q;YHHQ&f)Hs|UlL4Z6OF=7tY<3S0y4Y{fD&chCp0 z5T*@&{%jd^h;NgrToXiLKoK7;*KZn`&Z7{9U1FIf;p7`ok;yF5-uupJU12g`VEMV^GG*DeI#`^Q&+O$8QIZ8TuTqpR~7SNdSsx z4;(GzARkKQHOGS1)Uu#c5r}Z4e6nkldx!%F5cTP~j+PZ=%UhFMa+$I)**wcoUzJ4; z`s2?Wj|^*bVx>5-OzzWSes^};)B!6V7p7+xs4Jm0)V9oFW`6oQ`;z27-=+Kx*EsdV zY~^sc_5mR@##E_l4d&acK7vl+B<6i$>hrjzE-NgJDSU3GM05%M_(v~ti%D2oPnMQn z%VVSE9z>I@CDyjx?!^pU-es1Sw4@L*CdH%2AzN*mOMdkI*#s-E5I3agFo~)C)Wzw- zZAiV6eD>_}$~AZ@W0l|hb5!m!KtM@6ua<@cxXAZAFn`9TPFUet4gmaiVEqVW#8wlX zJhE4Ke>%grI{L?Vu&m)OnB9P z7JIUHh$F6VGt2Rh`k`F&;Ta7o#e=h$!6iBTgt~y6K2iUs-Gz3RoeYnhnuOJ#q40d8 z$aq=Hw&kWYGxse1eL_C4EW_K2?J|kt61JXKP8->@?_WTfVuPs2?rsEx&?t}O2wwA5 zOgP-S9X1`8{W8FO{g8B3(}YH~7BRYB`Asj3(2Nwkrvw~HuO4R9Ub&sDq?Lp*c1dyh zEKHIt(XqyfM1~kgl6~^NhSL~;6Dr_}_24%gSxf63kKkKrn#@KxYbG;vSzbVPtPx-P zISxX})*wpH#X13VdTh&4DOnSQx5Br#3udP`_?qAG0R~seJOM{sS+&|76J~^D5t?I4 z9{_8tPdTlEbA#(9U9e3{2256CV`8_c?^7@*unE`0eRL{j)}8|RwRKKD-GZTTFPLi5 z)Gxb6WM}Ksw|zEBnxAPZV;VYT0&MQUn1bx7eK)rH%!S_`8%VWr93x#JO=e#{Nrg)A zc(Hg~H!uXA(Pv;?R27b^DkR{=*J5%+MpROE(0g}cAJuQM6;@S~g_w<2z1HQB<%~A-55D$IkA6{&=zg_JTAtvj8 zRuobLw49bKR8I{{Q~baEI5$388EAiA)2AIkBf+A zSn>O3HSU|vH=q0tcN%`n5F$k~S;cJS(1&M#2>~=D(*}xJa)Zy%k5*m4gSk2s46uHp zLc`rAQ5Klf%RpMk?~HOr_}BU&9LvD!FS*cyz#UA7VjJkz^9M_Ke8I^(n9p3o}zVfUe8(F>O)CYcvprm z7Xx=)f`iU^FDk%^>YLdq)(>92TkV)8H0- z!bMT|wk;l2VTk4k8G`^2hZ4}RyYxZ|(?@%_x4Ljou+m>aq;}|vAp)&$n)7XcaZ`GR z#5$Y!_{WghH?`yz8`&=)-u- zLpX&#z1IqhsDl5JEb*H}OI!DqA2nyNXsZ^y`-!KiUXx*A)|3(PX)>ycxi{jQp+72Q3 zMudCGcsH*1LhEYRsiA5wz=kN*eIvHYG_Bcj!}U8N^tz}ybH8gJ(71v}O%)_B`Roes zJmD3gU!g^ZU9xxpet>(tm_slw6AlEg+`vn7M;yWPeW5zyywjxC=zbV?c zV>w5kT?VxC+Qp#o?>I)5|0AU*n&B%U#%kw$6o4UJGUDo-u5NTkt3{Q4%gwMm aC=?gd zbLm(jMT8DCvI)*UfbvRMx3=-&uU^7^GS!3ZD?-=ghWC11A^zl~OFIx|H0xT>Vl%Up zyB+_mMNtUP<1&3pa^K-GDtj{GOZUBeJfxvwoV1N9!E+r1c|foNQJRLQrptrbjB5NR z(Qmw=^Hb65%hxnbUk_?nL7Ow{uNk#6{6BUL^eZrJVZUx_uPoh)2U4YA`oYsG&sF`| zBzf82ST5#E6Uis`@I`gYcK6g6qA&afw!R<4X6B)7~| zt_>qz^AQk@o(l`DA0N{47g#sJG~O&^?>>;}`!cnFZIGHc|$dxAUxT$ckj^N!xjVrC2&HbSCILp~o8(^RmXXnwdGNlWU1ePROy}*e-&aSI$vh>$4GRFn;9j|ZiSpjqx%@PP>rSJavH&IPV LOR-koD(rs%oT+#5 diff --git a/views/js/e2e/interactions/fileupload/fixtures/sample.zip b/views/js/e2e/interactions/fileupload/fixtures/sample.zip deleted file mode 100644 index 143afc5857cf84333f622fbc2d031eb76ab65e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7174 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

23YnqKQ%p1 zRROK0vSk7@_SV(f7bo@nF5!K+#;zM|C4UU)^%M7dd!&pFvXGj7-RY7>5Rn zWVK~3@yYj>6HMF!oREUU1p3xfNBaxsLDh27*|W|Hx?u=!PpxnzW0Qi0X`VmN9ky2^*hg?fZ-E60yP}=B_vP z8<|ueUqR`k{3%H8Z}RhQ zS+ExFsZ}rBy2nnFh2D3>HjNGFBUMS^Z~wIUyOd z#yOU7ZzXpk!ogwQp~YsK+tm&sLXy6h1tF!9lD>PaqhK9w%AgY!&i96F#JB^ctZwU~ z=)FLqQDu9Cn>yJD$dmM|u-d>#$nGGPdjnyM(oWu?*U|ijak-M3c`YtL!+sei{8TZZ z$5uS&7kH;`!IsGRIfK#|q7h2jWcM)_c^fN zo1_Y}I3N9_t6-g!+ie!R@=#nE-jU|TLCaYaXR9?G+UklbT4H9nYHrjk!RG^9Wn*`& zP&xDj|K@DJ8K636Z3`!w!yvYL5zvH-zbFjfw!)#v4^$r^q2&W&kpt>>mtIMD;V3-b zTU~g_U+yC(R6Te_8;aI7%KEmyxG6b9WRXdD!a~=q=~q{9w>giWEQ$Voa}P$VGQZt- zf%CR1ouIUd{B%21OfEnh-f`MX&@&$S7*3{3p$wIisSnU@zr+1Wgz{8Jp6ZOBE*>SB{YITDh5P%^oM5wA`y z%HKZ&txHyr{5VZ5kr^_>okP;sX3eQ6QG zm+h41@rsr`{sWNsDP1owbAddD_Y~Fpv8>!bX_JY_CH`FBP9YhU2?-piW#XOnfO3kMwzhHMZ(hSa(^dU# z%7WHphW5IhAU>qTOFIw-G}D^@Vk3iui#6}8X+a>@(-K{BQm>&g3L6r_OP9S|9HgFn zw4|jnUaS^^)HgtmAVtkh-H~NBtrGWH#5)h@{8YsH@-=0{*Mll1(B{ngTRM$2pHChA zeRA|$m~R_e%Zs;SfD}n=h=hrCuYOVGv``3qllb-&Ycwtk~-C|2Uz`RU&@3#qEE9$}o%WoFs}2^|jQ!*z>A0 z^EEBfE}EjQS)Zud#X9_QZgrxxBNga79Tq0~nfJMO8VM;se_yOAc(d1rDo}F4pv`LM zCrf<_)<;3hY|8kN#&4%Qkw0=iR)7ZnVnQSa57i=i4$e?aYOz<4c>>x zYF8RJoBRH$(Pp#BmOwuVI+pUp>{D3XwMp<}2Zzz%5`_zp7=}1WE#HX`)~=IuqU6^v zQpb7oZEtTMngg^KjpOj6B=7(Eo2a6oAzv+P9{gWWO928D02BZK00;mjO(akIS9Yk7 z8vp>h8~^|c000000000003ZMW000000CQn&aBO8RaBgQ%O9ci1000010096v0002E I8vpOV diff --git a/views/js/e2e/interactions/hottext/fixtures/base64HottextInteractionTestPackage.js b/views/js/e2e/interactions/hottext/fixtures/base64HottextInteractionTestPackage.js deleted file mode 100644 index 7f6f8f17cc..0000000000 --- a/views/js/e2e/interactions/hottext/fixtures/base64HottextInteractionTestPackage.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * QTI test package with: - * - single hottext interaction - */ -export default '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'; diff --git a/views/js/e2e/interactions/hottext/hottext.spec.js b/views/js/e2e/interactions/hottext/hottext.spec.js deleted file mode 100644 index 3cc79e342d..0000000000 --- a/views/js/e2e/interactions/hottext/hottext.spec.js +++ /dev/null @@ -1,129 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import '../../_helpers/commands/setupCommands'; -import '../../_helpers/commands/cleanupCommands'; -import '../../_helpers/commands/navigationCommands'; - -import '../../_helpers/routes/backOfficeRoutes'; -import '../../_helpers/routes/runnerRoutes'; - -import {commonInteractionSelectors, itemInstructionFeedback} from '../../_helpers/selectors/interactionSelectors'; - -import base64Test from './fixtures/base64HottextInteractionTestPackage'; - -describe('Interactions', () => { - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Admin login - * - Import test package - * - Publish imported test as a delivery - * - Set guest access on delivery and save - * - Logout - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64Test, 'e2e hottext interaction test'); - cy.publishTest('e2e hottext interaction test'); - cy.setDeliveryForGuests('Delivery of e2e hottext interaction test'); - cy.logout(); - }); - - /** - * Log in & start the test - */ - beforeEach(() => { - cy.setupServer(); - cy.addRunnerRoutes(); - cy.guestLogin(); - cy.startTest('e2e hottext interaction test'); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem('e2e hottext interaction test'); - cy.deleteTest('e2e hottext interaction test'); - cy.deleteDelivery('Delivery of e2e hottext interaction test'); - }); - - /** - * Interactions tests - */ - describe('Hottext interaction', () => { - - it('Loads in proper state', function () { - cy.get(commonInteractionSelectors.interaction).within(() => { - cy.get(commonInteractionSelectors.itemInstruction).should('exist').and('be.visible').and('have.class', itemInstructionFeedback.info); - cy.get(commonInteractionSelectors.qtiChoice).should('exist').and('be.visible').and('have.length', 4); - }); - }); - - it('Click 1 choice and get info feedback', function () { - cy.get(commonInteractionSelectors.interaction).within(() => { - cy.get(commonInteractionSelectors.qtiChoice).first().click(); - cy.get(commonInteractionSelectors.itemInstruction).should('have.class', itemInstructionFeedback.info); - cy.get(commonInteractionSelectors.checkboxChecked).should('have.length', 1); - }); - }); - - it('Click 2 choices and get success feedback', function () { - cy.get(commonInteractionSelectors.interaction).within(() => { - cy.get(commonInteractionSelectors.qtiChoice).eq(0).click(); - cy.get(commonInteractionSelectors.qtiChoice).eq(1).click(); - cy.get(commonInteractionSelectors.itemInstruction).should('have.class', itemInstructionFeedback.success); - cy.get(commonInteractionSelectors.checkboxChecked).should('have.length', 2); - }); - }); - - it('Click 3 choices and get warning feedback', function () { - cy.get(commonInteractionSelectors.interaction).within(() => { - cy.get(commonInteractionSelectors.qtiChoice).eq(0).click(); - cy.get(commonInteractionSelectors.qtiChoice).eq(1).click(); - cy.get(commonInteractionSelectors.qtiChoice).eq(2).click(); - cy.get(commonInteractionSelectors.itemInstruction).should('have.class', itemInstructionFeedback.warning); - cy.get(commonInteractionSelectors.checkboxChecked).should('have.length', 2); - }); - }); - - it('Interaction keeps state', function () { - cy.get(commonInteractionSelectors.interaction).within(() => { - cy.get(commonInteractionSelectors.qtiChoice).eq(0).click(); - cy.get(commonInteractionSelectors.qtiChoice).eq(1).click(); - }); - - cy.nextItem(); - cy.previousItem(); - - cy.get(commonInteractionSelectors.interaction).within(() => { - cy.get(commonInteractionSelectors.itemInstruction).should('have.class', 'feedback-success'); - cy.get(commonInteractionSelectors.checkboxChecked).should('have.length', 2); - }); - }); - - }); -}); diff --git a/views/js/e2e/interactions/inline/choice.spec.js b/views/js/e2e/interactions/inline/choice.spec.js deleted file mode 100644 index 43aa59e647..0000000000 --- a/views/js/e2e/interactions/inline/choice.spec.js +++ /dev/null @@ -1,108 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import {inlineInteractionSelectors} from '../../_helpers/selectors/interactionSelectors'; - -import '../../_helpers/commands/setupCommands'; -import '../../_helpers/commands/cleanupCommands'; -import '../../_helpers/commands/navigationCommands'; -import '../../_helpers/routes/backOfficeRoutes'; -import '../../_helpers/routes/runnerRoutes'; - -import base64Test from './fixtures/inlineChoiceInteractionTest'; - -describe('Inline Choice Interaction', () => { - const testName = 'E2E Inline Choice Interaction Test'; - const deliveryName = `Delivery of ${testName}`; - - /** - * Setup to have a proper delivery - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64Test, testName); - cy.publishTest(testName); - cy.setDeliveryForGuests(deliveryName); - cy.logout(); - }); - - /** - * Log in & start the test - */ - beforeEach(() => { - cy.setupServer(); - cy.addRunnerRoutes(); - cy.guestLogin(); - cy.startTest(testName); - - // basic element - cy.get(inlineInteractionSelectors.choiceDropdown).as('inlineChoice'); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem(testName); - cy.deleteTest(testName); - cy.deleteDelivery(deliveryName); - }); - - it('Interaction options are selectable and save selection', () => { - cy.get('@inlineChoice').click(); - - // options and empty option are visible - cy.get(inlineInteractionSelectors.choiceOption).should('have.length', 3).and('be.visible') - - // select second option - .eq(2).click(); - - cy.get(inlineInteractionSelectors.choosenOption).contains('that'); - - cy.nextItem(); - cy.previousItem(); - - cy.get(inlineInteractionSelectors.choosenOption).contains('that'); - }); - - it('Required option should show tooltip message', () => { - cy.nextItem(); - - // required option should show tooltip - cy.get('.tooltip').should('exist'); - - cy.get('@inlineChoice').click(); - - // options are visible but there is no empty option - cy.get(inlineInteractionSelectors.choiceOption).should('have.length', 3).and('be.visible'); - }); - - it('Random order should show all choices', () => { - cy.nextItem(); - - cy.get('@inlineChoice').click(); - - // options are visible - cy.get(inlineInteractionSelectors.choiceOption).should('have.length', 3).and('be.visible'); - }); -}); diff --git a/views/js/e2e/interactions/inline/fixtures/inlineChoiceInteractionTest.js b/views/js/e2e/interactions/inline/fixtures/inlineChoiceInteractionTest.js deleted file mode 100644 index 1b178cce75..0000000000 --- a/views/js/e2e/interactions/inline/fixtures/inlineChoiceInteractionTest.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -export default "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"; diff --git a/views/js/e2e/interactions/inline/fixtures/inlineTextEntryInteractionTest.js b/views/js/e2e/interactions/inline/fixtures/inlineTextEntryInteractionTest.js deleted file mode 100644 index 330341fa74..0000000000 --- a/views/js/e2e/interactions/inline/fixtures/inlineTextEntryInteractionTest.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -export default "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"; \ No newline at end of file diff --git a/views/js/e2e/interactions/inline/textEntry.spec.js b/views/js/e2e/interactions/inline/textEntry.spec.js deleted file mode 100644 index 1dd0e34424..0000000000 --- a/views/js/e2e/interactions/inline/textEntry.spec.js +++ /dev/null @@ -1,115 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import {inlineInteractionSelectors} from '../../_helpers/selectors/interactionSelectors'; - -import '../../_helpers/commands/setupCommands'; -import '../../_helpers/commands/cleanupCommands'; -import '../../_helpers/commands/navigationCommands'; -import '../../_helpers/routes/backOfficeRoutes'; -import '../../_helpers/routes/runnerRoutes'; - -import base64Test from './fixtures/inlineTextEntryInteractionTest'; - -describe('Inline Choice Interaction', () => { - const testName = 'E2E Inline Text Entry Interaction Test'; - const deliveryName = `Delivery of ${testName}`; - - /** - * Setup to have a proper delivery - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64Test, testName); - cy.publishTest(testName); - cy.setDeliveryForGuests(deliveryName); - cy.logout(); - }); - - /** - * Log in & start the test - */ - beforeEach(() => { - cy.setupServer(); - cy.addRunnerRoutes(); - cy.guestLogin(); - cy.startTest(testName); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem(testName); - cy.deleteTest(testName); - cy.deleteDelivery(deliveryName); - }); - - it('Basic behaviour', () => { - cy.get(inlineInteractionSelectors.textEntry).eq(0) - // have placeholder - .should('have.attr', 'placeholder', 'what?') - - .type('question') - - // can type in it - .should('have.value', 'question'); - }); - - it('Max length', () => { - cy.get(inlineInteractionSelectors.textEntry).eq(1).focus(); - - // max length should be notified - cy.get('.tooltip').contains('4 characters allowed'); - - cy.get(inlineInteractionSelectors.textEntry).eq(1).type('100'); - - cy.get('.tooltip').contains('3/4'); - - // cannot type more if length is reached - cy.get(inlineInteractionSelectors.textEntry).eq(1).type('00') - .should('have.value', '1000'); - }); - - it('Saves value if go to next question', () => { - cy.get(inlineInteractionSelectors.textEntry).eq(0).type('answer'); - - cy.nextItem(); - cy.previousItem(); - - // have previously set value - cy.get(inlineInteractionSelectors.textEntry).eq(0).should('have.value', 'answer'); - }); - - it('Regular expression validator', () => { - cy.nextItem(); - cy.get(inlineInteractionSelectors.textEntry).eq(0).type('foo'); - - // invalid format should be notified - cy.get('.tooltip').contains('This is not a valid answer'); - - cy.get(inlineInteractionSelectors.textEntry).eq(0).clear().type('31'); - - cy.get('.tooltip').should('be.not.visible'); - }); -}); diff --git a/views/js/e2e/interactions/match/fixtures/base64ChoiceInteractionTestPackage.js b/views/js/e2e/interactions/match/fixtures/base64ChoiceInteractionTestPackage.js deleted file mode 100644 index f456a99d1e..0000000000 --- a/views/js/e2e/interactions/match/fixtures/base64ChoiceInteractionTestPackage.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * QTI test package with: - * - single item - * - single choice interaction - * - tools enabled: none - */ -export default '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'; - diff --git a/views/js/e2e/interactions/match/match.spec.js b/views/js/e2e/interactions/match/match.spec.js deleted file mode 100644 index d288625ae6..0000000000 --- a/views/js/e2e/interactions/match/match.spec.js +++ /dev/null @@ -1,123 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import {commonInteractionSelectors, itemInstructionFeedback, matchInteractionSelectors} from '../../_helpers/selectors/interactionSelectors'; - -import '../../_helpers/commands/setupCommands'; -import '../../_helpers/commands/cleanupCommands'; -import '../../_helpers/commands/navigationCommands'; - -import '../../_helpers/routes/backOfficeRoutes'; -import '../../_helpers/routes/runnerRoutes'; - -import base64Test from './fixtures/base64ChoiceInteractionTestPackage'; - -describe('Interactions', () => { - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Admin login - * - Import test package - * - Publish imported test as a delivery - * - Set guest access on delivery and save - * - Logout - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64Test, 'e2e match interaction test'); - cy.publishTest('e2e match interaction test'); - cy.setDeliveryForGuests('Delivery of e2e match interaction test'); - cy.logout(); - }); - - /** - * Log in & start the test - */ - beforeEach(() => { - cy.setupServer(); - cy.addRunnerRoutes(); - cy.guestLogin(); - cy.startTest('e2e match interaction test'); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem('e2e match interaction test'); - cy.deleteTest('e2e match interaction test'); - cy.deleteDelivery('Delivery of e2e match interaction test'); - }); - - /** - * Interaction tests - */ - describe('Match interaction', () => { - it('Loads in proper state', () => { - cy.get(commonInteractionSelectors.interaction).within(() => { - cy.get(commonInteractionSelectors.qtiChoice).should('exist'); - cy.get(matchInteractionSelectors.interactionArea).find(commonInteractionSelectors.checkboxIcon).should('exist'); - cy.get(commonInteractionSelectors.itemInstruction).should('exist').and('be.visible').and('have.class', itemInstructionFeedback.info); - }); - }); - - it('Can interact with checkbox', () => { - cy.get(matchInteractionSelectors.interactionArea).within(() => { - cy.get(commonInteractionSelectors.checkboxIcon).first().click(); - cy.get(commonInteractionSelectors.checkboxChecked).should('have.length', 1); - }); - cy.get(commonInteractionSelectors.itemInstruction).should('have.class', itemInstructionFeedback.info); - }); - - it('Cannot choose because max reached', function () { - cy.get(matchInteractionSelectors.interactionArea).within(() => { - cy.get(commonInteractionSelectors.checkboxIcon).eq(0).click(); - cy.get(commonInteractionSelectors.checkboxIcon).eq(1).click(); - cy.get(commonInteractionSelectors.checkboxIcon).eq(2).click(); - cy.get(commonInteractionSelectors.checkboxIcon).eq(3).click(); - cy.get(commonInteractionSelectors.checkboxChecked).should('have.length', 3); - }); - - cy.get(commonInteractionSelectors.itemInstruction).should('have.class', itemInstructionFeedback.warning); - cy.wait(1000); - cy.get(commonInteractionSelectors.itemInstruction).should('have.class', itemInstructionFeedback.success); - }); - - it('Interaction keeps state', function () { - cy.get(matchInteractionSelectors.interactionArea).within(() => { - cy.get(commonInteractionSelectors.checkboxIcon).eq(0).click(); - cy.get(commonInteractionSelectors.checkboxIcon).eq(1).click(); - }); - cy.get(commonInteractionSelectors.itemInstruction).should('have.class', itemInstructionFeedback.success); - - cy.nextItem(); - cy.previousItem(); - - cy.get(matchInteractionSelectors.interactionArea).find(commonInteractionSelectors.checkboxChecked).should('have.length', 2); - cy.get(commonInteractionSelectors.itemInstruction).should('have.class', itemInstructionFeedback.success); - }); - - }); -}); diff --git a/views/js/e2e/interactions/media/fixtures/base64MediaInteractionTest.js b/views/js/e2e/interactions/media/fixtures/base64MediaInteractionTest.js deleted file mode 100644 index 294bf125af..0000000000 --- a/views/js/e2e/interactions/media/fixtures/base64MediaInteractionTest.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * QTI test packages - */ - -const base64MediaInteractionTest = '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'; - -export default base64MediaInteractionTest; diff --git a/views/js/e2e/interactions/media/media.spec.js b/views/js/e2e/interactions/media/media.spec.js deleted file mode 100644 index 3da38572fd..0000000000 --- a/views/js/e2e/interactions/media/media.spec.js +++ /dev/null @@ -1,381 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import {commonInteractionSelectors, mediaInteractionSelectors} from '../../_helpers/selectors/interactionSelectors'; - -import '../../_helpers/commands/setupCommands'; -import '../../_helpers/commands/cleanupCommands'; -import '../../_helpers/commands/pointerCommands'; - -import '../../_helpers/routes/backOfficeRoutes'; -import '../../_helpers/routes/runnerRoutes'; - -import base64Test from './fixtures/base64MediaInteractionTest'; - -const VIDEO_IS_LOADED = 1000; - -const assertVideoPlaying = (videoElement, pauseElementVisible = true) => { - cy.get(mediaInteractionSelectors.playButton).should('exist').and('not.be.visible'); - - pauseElementVisible - ? cy.get(mediaInteractionSelectors.pauseButton).should('exist').and('be.visible') - : cy.get(mediaInteractionSelectors.pauseButton).should('exist').and('not.be.visible'); - - expect(videoElement.currentTime).to.be.greaterThan(0); - expect(videoElement.paused).to.be.false; - expect(videoElement.ended).to.be.false; - expect(videoElement.readyState).to.be.greaterThan(2); -}; - -const assertVideoPaused = (videoElement) => { - cy.get(mediaInteractionSelectors.mediaPlayer).should('have.class', 'paused'); - cy.get(mediaInteractionSelectors.playButton).should('exist').and('be.visible'); - cy.get(mediaInteractionSelectors.pauseButton).should('exist').and('not.be.visible'); - - expect(videoElement.paused).to.be.true; - expect(videoElement.ended).to.be.false; - expect(videoElement.readyState).to.be.greaterThan(2); -}; - - -const assertVideoDisabled = () => { - // media player - cy.get(mediaInteractionSelectors.mediaPlayer).should('have.class', 'paused'); - cy.get(mediaInteractionSelectors.mediaPlayer).should('have.class', 'ended'); - cy.get(mediaInteractionSelectors.mediaPlayer).should('have.class', 'disabled'); - - // video container - cy.get(mediaInteractionSelectors.video).should('exist').should('be.visible'); - - // player controls - cy.get(mediaInteractionSelectors.playButton).should('exist').and('not.be.visible'); - cy.get(mediaInteractionSelectors.pauseButton).should('exist').and('not.be.visible'); - - // sound controls - cy.get(mediaInteractionSelectors.muteSound).should('exist').and('not.be.visible'); - cy.get(mediaInteractionSelectors.unmuteSound).should('exist').and('not.be.visible'); - cy.get(mediaInteractionSelectors.volumeSliderBar).should('exist').and('not.be.visible'); - cy.get(mediaInteractionSelectors.volumeSliderHandle).should('exist').and('not.be.visible'); - - // time controls - cy.get(mediaInteractionSelectors.currentTime).should('exist').and('not.be.visible'); - cy.get(mediaInteractionSelectors.durationTime).should('exist').and('not.be.visible'); - - // bar controls - cy.get(mediaInteractionSelectors.seekSliderBar).should('exist').and('not.be.visible'); - cy.get(mediaInteractionSelectors.seekSliderHandle).should('exist').and('not.be.visible'); -}; - -describe('Interactions', () => { - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Admin login - * - Import test package - * - Publish imported test as a delivery - * - Set guest access on delivery and save - * - Logout - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64Test, 'e2e media interaction test'); - cy.publishTest('e2e media interaction test'); - cy.setDeliveryForGuests('Delivery of e2e media interaction test'); - cy.logout(); - }); - - /** - * Log in & start the test - */ - beforeEach(() => { - cy.setupServer(); - cy.addRunnerRoutes(); - cy.guestLogin(); - cy.startTest('e2e media interaction test'); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem('e2e media interaction test'); - cy.deleteTest('e2e media interaction test'); - cy.deleteDelivery('Delivery of e2e media interaction test'); - }); - - /** - * Interactions tests - */ - describe('Media interaction', () => { - - describe('Loading', () => { - - it('Media player loads in proper state', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - // media player container - cy.get(mediaInteractionSelectors.mediaPlayer) - .should('exist') - .and('have.class', 'video/mp4') - .and('have.class', 'paused') - .and('have.class', 'ended') - .and('have.class', 'ready') - .and('have.class', 'canplay'); - - // video container - cy.get(mediaInteractionSelectors.video).should('exist'); - - // video controls - cy.get(mediaInteractionSelectors.playButton).should('exist').and('be.visible'); - cy.get(mediaInteractionSelectors.pauseButton).should('exist').and('not.be.visible'); - - // sound controls - cy.get(mediaInteractionSelectors.muteSound).should('exist').and('be.visible'); - cy.get(mediaInteractionSelectors.unmuteSound).should('exist').and('not.be.visible'); - - cy.get(mediaInteractionSelectors.volumeSliderBar).should('exist').and('be.visible'); - cy.get(mediaInteractionSelectors.volumeSliderHandle).should('exist').and('be.visible'); - - // time controls - cy.get(mediaInteractionSelectors.currentTime).should('exist').and('be.visible'); - cy.get(mediaInteractionSelectors.durationTime).should('exist').and('be.visible'); - - // bar controls - cy.get(mediaInteractionSelectors.seekSliderBar).should('exist').and('be.visible'); - cy.get(mediaInteractionSelectors.seekSliderHandle).should('exist').and('be.visible'); - - }); - }); - - it('Video loads in proper state', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(mediaInteractionSelectors.video).then(video => { - const videoElement = video.get(0); - expect(videoElement.currentTime).to.equal(0); - expect(videoElement.seeking).to.be.false; - expect(videoElement.duration).to.equal(6.234); - expect(videoElement.paused).to.be.true; - expect(videoElement.ended).to.be.false; - expect(videoElement.loop).to.be.false; - expect(videoElement.autoplay).to.be.false; - }); - }); - }); - - it('Video starts when autoplay option is ON', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(1).within(() => { - cy.get(mediaInteractionSelectors.video).then(video => { - const videoElement = video.get(0); - assertVideoPlaying(videoElement, false); - }); - }); - }); - - it('Video is playing in loop when loop option is ON', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(1).within(() => { - cy.get(mediaInteractionSelectors.video).then(video => { - const videoElement = video.get(0); - cy.wait(videoElement.duration * 1000).then(() => { - //interaction.data('timesPlayed') - assertVideoPlaying(videoElement, false); - }); - }); - }); - }); - - }); - - describe('Video Controls', () => { - - it('Can play video using player buttons', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(mediaInteractionSelectors.playButton).click(); - cy.get(mediaInteractionSelectors.video).then(video => { - const videoElement = video.get(0); - assertVideoPlaying(videoElement); - }); - }); - }); - - it('Can play video using overlay buttons', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(mediaInteractionSelectors.overlayPlayButton).click({force: true}); - cy.get(mediaInteractionSelectors.video).then(video => { - const videoElement = video.get(0); - assertVideoPlaying(videoElement); - }); - }); - }); - - it('Can pause video using player buttons', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(mediaInteractionSelectors.playButton).click(); - cy.get(mediaInteractionSelectors.pauseButton).click(); - cy.get(mediaInteractionSelectors.video).then(video => { - const videoElement = video.get(0); - assertVideoPaused(videoElement); - }); - }); - }); - - it('Can pause video using overlay buttons', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(mediaInteractionSelectors.overlayPlayButton).click({force: true}); - cy.get(mediaInteractionSelectors.overlayPauseButton).click({force: true}); - - cy.get(mediaInteractionSelectors.video).then(video => { - const videoElement = video.get(0); - assertVideoPaused(videoElement); - }); - }); - }); - - it('Can resume video using player buttons', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(mediaInteractionSelectors.playButton).click(); - cy.get(mediaInteractionSelectors.pauseButton).click(); - cy.get(mediaInteractionSelectors.playButton).click(); - - cy.get(mediaInteractionSelectors.video).then(video => { - const videoElement = video.get(0); - assertVideoPlaying(videoElement); - }); - - }); - }); - - it('Can resume video using overlay buttons', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(mediaInteractionSelectors.overlayPlayButton).click({force: true}); - cy.get(mediaInteractionSelectors.overlayPauseButton).click({force: true}); - cy.get(mediaInteractionSelectors.overlayPlayButton).click({force: true}); - - cy.get(mediaInteractionSelectors.video).then(video => { - const videoElement = video.get(0); - assertVideoPlaying(videoElement); - }); - - }); - }); - - it('Can\'t play after max plays count', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(mediaInteractionSelectors.video).then(video => { - const videoElement = video.get(0); - - cy.get(mediaInteractionSelectors.playButton).click(); - cy.wait(videoElement.duration + 100).then(() => { - assertVideoDisabled(videoElement); - }); - - }); - }); - - }); - - }); - - describe('Sound Controls', () => { - - it('Can mute sound', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - - cy.get(mediaInteractionSelectors.muteSound).click({force: true}); - cy.get(mediaInteractionSelectors.video).then(video => { - const videoElement = video.get(0); - expect(videoElement.muted).to.be.true; - }); - - cy.get(mediaInteractionSelectors.mediaPlayer).should('have.class', 'muted'); - cy.get(mediaInteractionSelectors.muteSound).should('exist').and('not.be.visible'); - cy.get(mediaInteractionSelectors.unmuteSound).should('exist').and('be.visible'); - }); - }); - - it('Can unmute sound', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(mediaInteractionSelectors.muteSound).click({force: true}); - cy.get(mediaInteractionSelectors.unmuteSound).click({force: true}); - - cy.get(mediaInteractionSelectors.mediaPlayer).should('not.have.class', 'muted'); - cy.get(mediaInteractionSelectors.muteSound).should('exist').and('be.visible'); - cy.get(mediaInteractionSelectors.unmuteSound).should('exist').and('not.be.visible'); - }); - }); - - it('Can change volume', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(1).within(() => { - cy.get(mediaInteractionSelectors.muteSound).trigger('mouseover', {force: true}); - cy.get(mediaInteractionSelectors.volumeSliderBar).click('center', {force: true}); - cy.wait(1000); - cy.get(mediaInteractionSelectors.volumeSliderPosition).should('have.css', 'top', '49px') - }); - }); - - }); - - describe('Timer information', () => { - it('Timers info are correct', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(mediaInteractionSelectors.currentTime).should('contain', '00:00'); - cy.get(mediaInteractionSelectors.durationTime).should('contain', '00:06'); - }); - }); - - it('Timers info are updated', function () { - cy.wait(VIDEO_IS_LOADED); - cy.get(commonInteractionSelectors.interaction).eq(0).within(() => { - cy.get(mediaInteractionSelectors.currentTime).should('contain', '00:00'); - cy.get(mediaInteractionSelectors.durationTime).should('contain', '00:06'); - - cy.get(mediaInteractionSelectors.playButton).click(); - cy.wait(1000); - cy.get(mediaInteractionSelectors.pauseButton).click(); - - cy.get(mediaInteractionSelectors.currentTime).should('contain', '00:01'); - cy.get(mediaInteractionSelectors.durationTime).should('contain', '00:06'); - - }); - }); - - }); - - }); - -}); diff --git a/views/js/e2e/interactions/order/fixtures/orderInteractionTest.js b/views/js/e2e/interactions/order/fixtures/orderInteractionTest.js deleted file mode 100644 index 4b6574b4f4..0000000000 --- a/views/js/e2e/interactions/order/fixtures/orderInteractionTest.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -export default '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'; \ No newline at end of file diff --git a/views/js/e2e/interactions/order/order.spec.js b/views/js/e2e/interactions/order/order.spec.js deleted file mode 100644 index 6ca4b6b3eb..0000000000 --- a/views/js/e2e/interactions/order/order.spec.js +++ /dev/null @@ -1,277 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import {commonInteractionSelectors, orderInteractionSelectors} from '../../_helpers/selectors/interactionSelectors'; - -import '../../_helpers/commands/setupCommands'; -import '../../_helpers/commands/cleanupCommands'; -import '../../_helpers/commands/navigationCommands'; -import '../../_helpers/routes/backOfficeRoutes'; -import '../../_helpers/routes/runnerRoutes'; - -import base64Test from './fixtures/orderInteractionTest'; - -describe('Order Interaction', () => { - const testName = 'E2E Order Interaction Test'; - const deliveryName = `Delivery of ${testName}`; - - /** - * Setup to have a proper delivery - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64Test, testName); - cy.publishTest(testName); - cy.setDeliveryForGuests(deliveryName); - cy.logout(); - }); - - /** - * Log in & start the test - */ - beforeEach(() => { - cy.setupServer(); - cy.addRunnerRoutes(); - cy.guestLogin(); - cy.startTest(testName); - - // basic elements - cy.get(commonInteractionSelectors.qtiOrder).as('interaction').within(() => { - cy.get(commonInteractionSelectors.choiceArea).as('choiceArea'); - cy.get(commonInteractionSelectors.resultArea).as('resultArea'); - cy.get(orderInteractionSelectors.addToSelection).as('addToSelection'); - }); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem(testName); - cy.deleteTest(testName); - cy.deleteDelivery(deliveryName); - }); - - const firstChoiceSelector = '.qti-choice[data-identifier=choice_1]'; - const secondChoiceSelector = '.qti-choice[data-identifier=choice_2]'; - const thirdChoiceSelector = '.qti-choice[data-identifier=choice_3]'; - - it('Interaction keeps adding order in result area', () => { - cy.get('@choiceArea').within(() => { - cy.get(secondChoiceSelector).click(); - cy.get(thirdChoiceSelector).click(); - cy.get(firstChoiceSelector).click(); - }); - - cy.get('@resultArea').then(resultArea => { - const firstChoice = resultArea[0].querySelector(firstChoiceSelector); - const secondChoice = resultArea[0].querySelector(secondChoiceSelector); - const thirdChoice = resultArea[0].querySelector(thirdChoiceSelector); - - // second choice is before all of them - expect(secondChoice.compareDocumentPosition(firstChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - expect(secondChoice.compareDocumentPosition(thirdChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - - //third choice is before first one - expect(thirdChoice.compareDocumentPosition(firstChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - }); - }); - - it('Able to reorder choices in result area', () => { - cy.get('@choiceArea').within(() => { - cy.get(firstChoiceSelector).click(); - cy.get(secondChoiceSelector).click(); - cy.get(thirdChoiceSelector).click(); - }); - - cy.get('@resultArea').then(resultArea => { - const firstChoice = resultArea[0].querySelector(firstChoiceSelector); - const secondChoice = resultArea[0].querySelector(secondChoiceSelector); - const thirdChoice = resultArea[0].querySelector(thirdChoiceSelector); - - // first choice is before all of them - expect(firstChoice.compareDocumentPosition(secondChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - expect(firstChoice.compareDocumentPosition(thirdChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - - //second choice is before third one - expect(secondChoice.compareDocumentPosition(thirdChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - }); - - // move third choice upper - cy.get('@resultArea').within(() => { - cy.get(thirdChoiceSelector).click(); - }); - cy.get(orderInteractionSelectors.moveBefore).click(); - cy.get('@resultArea').then(resultArea => { - const firstChoice = resultArea[0].querySelector(firstChoiceSelector); - const secondChoice = resultArea[0].querySelector(secondChoiceSelector); - const thirdChoice = resultArea[0].querySelector(thirdChoiceSelector); - - // first choice is before all of them - expect(firstChoice.compareDocumentPosition(secondChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - expect(firstChoice.compareDocumentPosition(thirdChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - - //second choice is after third one - expect(secondChoice.compareDocumentPosition(thirdChoice) & Node.DOCUMENT_POSITION_PRECEDING).to.not.equal(0); - }); - - //move first choice downer - cy.get('@resultArea').within(() => { - cy.get(firstChoiceSelector).click(); - }); - cy.get(orderInteractionSelectors.moveAfter).click(); - cy.get('@resultArea').then(resultArea => { - const firstChoice = resultArea[0].querySelector(firstChoiceSelector); - const secondChoice = resultArea[0].querySelector(secondChoiceSelector); - const thirdChoice = resultArea[0].querySelector(thirdChoiceSelector); - - // third choice is before all of them - expect(thirdChoice.compareDocumentPosition(firstChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - expect(thirdChoice.compareDocumentPosition(secondChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - - // first choice is before second one - expect(firstChoice.compareDocumentPosition(secondChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - }); - - //move first choice to the bottom - cy.get(orderInteractionSelectors.moveAfter).click(); - cy.get('@resultArea').then(resultArea => { - const firstChoice = resultArea[0].querySelector(firstChoiceSelector); - const secondChoice = resultArea[0].querySelector(secondChoiceSelector); - const thirdChoice = resultArea[0].querySelector(thirdChoiceSelector); - - // third choice is before all of them - expect(thirdChoice.compareDocumentPosition(firstChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - expect(thirdChoice.compareDocumentPosition(secondChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - - // first choice is after second one - expect(firstChoice.compareDocumentPosition(secondChoice) & Node.DOCUMENT_POSITION_PRECEDING).to.not.equal(0); - }); - }); - - it('Interaction keeps state when move to next question', () => { - cy.get('@choiceArea').within(() => { - cy.get(secondChoiceSelector).click(); - cy.get(thirdChoiceSelector).click(); - cy.get(firstChoiceSelector).click(); - }); - - // go forward - cy.nextItem(); - - // go backward - cy.previousItem(); - - // choices are in in the same orders - cy.get('@resultArea').then(resultArea => { - const firstChoice = resultArea[0].querySelector(firstChoiceSelector); - const secondChoice = resultArea[0].querySelector(secondChoiceSelector); - const thirdChoice = resultArea[0].querySelector(thirdChoiceSelector); - - // second choice is before all of them - expect(secondChoice.compareDocumentPosition(firstChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - expect(secondChoice.compareDocumentPosition(thirdChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - - //third choice is before first one - expect(thirdChoice.compareDocumentPosition(firstChoice) & Node.DOCUMENT_POSITION_FOLLOWING).to.not.equal(0); - }); - }); - - it('Horizontal orientation basic features are working', () => { - // go to horizontal orientation - cy.nextItem(); - - cy.get('@choiceArea').within(() => { - cy.get(secondChoiceSelector).click(); - cy.get(thirdChoiceSelector).click(); - cy.get(firstChoiceSelector).click(); - }); - - cy.get('@resultArea').within(() => { - cy.get(firstChoiceSelector).should('visible').click(); - cy.get(secondChoiceSelector).should('visible'); - cy.get(thirdChoiceSelector).should('visible'); - }); - - // choice1 selection activate remove action - cy.get(orderInteractionSelectors.removeFromSelection).click(); - - // choice1 is back again in choice area - cy.get('@choiceArea').within(() => { - cy.get(firstChoiceSelector).should('visible'); - }); - - // select choice2 - cy.get('@resultArea').within(() => { - cy.get(secondChoiceSelector).click(); - }); - - cy.get(orderInteractionSelectors.moveAfter).click(); - - cy.get('@resultArea').then(resultArea => { - const secondChoice = resultArea[0].querySelector(secondChoiceSelector); - const thirdChoice = resultArea[0].querySelector(thirdChoiceSelector); - - // second choice is after third choice - expect(secondChoice.compareDocumentPosition(thirdChoice) & Node.DOCUMENT_POSITION_PRECEDING).to.not.equal(0); - }); - }); - - it('Random order list all choices', () => { - // go to random choices test - cy.nextItem(); - cy.nextItem(); - - cy.get('@choiceArea').within(() => { - for (let i = 1; i <= 7; i++) { - cy.get(`.qti-choice[data-identifier=choice_${i}]`).should('visible'); - } - }); - }); - - it('Minimun and maximum selection instruction', () => { - // go to random choices test - cy.nextItem(); - cy.nextItem(); - - cy.get('.instruction-container').children().eq(0).should('have.class', 'feedback-info'); - - // add two item to reach min requirement - cy.get(firstChoiceSelector).click(); - cy.get(secondChoiceSelector).click(); - - // min requirement should be success - cy.get('.instruction-container').children().eq(0).should('have.class', 'feedback-success'); - - - // cannot add more element - cy.get(thirdChoiceSelector).click(); - - cy.get('@choiceArea').within(() => { - cy.get(thirdChoiceSelector).should('exist'); - }); - - // max requirement should be warning - cy.get('.instruction-container').children().eq(1).should('have.class', 'feedback-warning'); - }); -}); diff --git a/views/js/e2e/interactions/slider/fixtures/base64SliderInteractionTest.js b/views/js/e2e/interactions/slider/fixtures/base64SliderInteractionTest.js deleted file mode 100644 index 23b4d53621..0000000000 --- a/views/js/e2e/interactions/slider/fixtures/base64SliderInteractionTest.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * QTI test package - */ - -export default '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'; - - diff --git a/views/js/e2e/interactions/slider/slider.spec.js b/views/js/e2e/interactions/slider/slider.spec.js deleted file mode 100644 index 7b851cd1c7..0000000000 --- a/views/js/e2e/interactions/slider/slider.spec.js +++ /dev/null @@ -1,129 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import {commonInteractionSelectors, sliderInteractionSelectors} from '../../_helpers/selectors/interactionSelectors'; - -import '../../_helpers/commands/setupCommands'; -import '../../_helpers/commands/cleanupCommands'; -import '../../_helpers/commands/pointerCommands'; -import '../../_helpers/commands/navigationCommands'; - -import '../../_helpers/routes/backOfficeRoutes'; -import '../../_helpers/routes/runnerRoutes'; - -import base64Test from './fixtures/base64SliderInteractionTest'; - -describe('Interactions', () => { - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Admin login - * - Import test package - * - Publish imported test as a delivery - * - Set guest access on delivery and save - * - Logout - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64Test, 'e2e slider interaction test'); - cy.publishTest('e2e slider interaction test'); - cy.setDeliveryForGuests('Delivery of e2e slider interaction test'); - cy.logout(); - }); - - /** - * Log in & start the test - */ - beforeEach(() => { - cy.setupServer(); - cy.addRunnerRoutes(); - cy.guestLogin(); - cy.startTest('e2e slider interaction test'); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem('e2e slider interaction test'); - cy.deleteTest('e2e slider interaction test'); - cy.deleteDelivery('Delivery of e2e slider interaction test'); - }); - - /** - * Interactions tests - */ - describe('Slider interaction', () => { - - it('Loads in proper state', function () { - cy.get(commonInteractionSelectors.interaction).within(() => { - - // check for the correct minimum and maximum values - cy.get(sliderInteractionSelectors.labels).within(() => { - cy.get(sliderInteractionSelectors.minLabel).should('have.text', '0'); - cy.get(sliderInteractionSelectors.maxLabel).should('have.text', '10'); - }); - - // current value should be zero - cy.get(sliderInteractionSelectors.currentValue).should('have.text', '0'); - }); - }); - - it('Slides when dragged', function () { - cy.get(commonInteractionSelectors.interaction).within(() => { - cy.get(sliderInteractionSelectors.sliderHandle).dragToPoint({x: 500, y: 50}); - cy.get(sliderInteractionSelectors.currentValue).should('have.text', '5'); - }); - }); - - it('Slides when clicked', function () { - cy.get(commonInteractionSelectors.interaction).within(() => { - cy.get(sliderInteractionSelectors.sliderBar).click('center', { force: true }); - cy.get(sliderInteractionSelectors.currentValue).should('have.text', '5'); - }); - }); - - it('Step check', function () { - cy.get(commonInteractionSelectors.interaction).within(() => { - for (let step = 1; step < 10; step++) { - cy.get(sliderInteractionSelectors.sliderHandle).dragToPoint({x: step * 100, y: 0}); - cy.get(sliderInteractionSelectors.currentValue).should('have.text', `${step}`); - } - }); - }); - - it('Interaction keeps state', function () { - cy.get(commonInteractionSelectors.interaction).within(() => { - cy.get(sliderInteractionSelectors.sliderBar).click('center', {force: true}); - cy.get(sliderInteractionSelectors.currentValue).should('have.text', '5'); - }); - - cy.nextItem(); - cy.previousItem(); - - cy.get(commonInteractionSelectors.interaction).find(sliderInteractionSelectors.currentValue).should('have.text', '5'); - }); - }); -}); diff --git a/views/js/e2e/runner/navigation/fixtures/base64NavigationLinearTestPackage.js b/views/js/e2e/runner/navigation/fixtures/base64NavigationLinearTestPackage.js deleted file mode 100644 index 748129cb24..0000000000 --- a/views/js/e2e/runner/navigation/fixtures/base64NavigationLinearTestPackage.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * QTI test packages with 3 items - */ - -const base64LinearTest = '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'; - -export default base64LinearTest; diff --git a/views/js/e2e/runner/navigation/fixtures/base64NavigationNonLinearTestPackage.js b/views/js/e2e/runner/navigation/fixtures/base64NavigationNonLinearTestPackage.js deleted file mode 100644 index bb2746ccfb..0000000000 --- a/views/js/e2e/runner/navigation/fixtures/base64NavigationNonLinearTestPackage.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -/** - * QTI test packages with 3 items - */ - -const base64NonLinearTest = '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'; - -export default base64NonLinearTest; diff --git a/views/js/e2e/runner/navigation/navigation.spec.js b/views/js/e2e/runner/navigation/navigation.spec.js deleted file mode 100644 index 9e9d0f887a..0000000000 --- a/views/js/e2e/runner/navigation/navigation.spec.js +++ /dev/null @@ -1,376 +0,0 @@ -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; under version 2 - * of the License (non-upgradable). - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Copyright (c) 2019 (original work) Open Assessment Technologies SA ; - */ - -import '../../_helpers/routes/backOfficeRoutes'; -import '../../_helpers/routes/runnerRoutes'; - -import '../../_helpers/commands/setupCommands'; -import '../../_helpers/commands/cleanupCommands'; -import '../../_helpers/commands/navigationCommands'; - -import runnerUrls from '../../_helpers/urls/runnerUrls'; - -import base64LinearTest from './fixtures/base64NavigationLinearTestPackage'; -import base64NonLinearTest from './fixtures/base64NavigationNonLinearTestPackage'; -import navigationSelectors from "../../_helpers/selectors/navigationSelectors"; - -describe('Navigation', () => { - - /** - * Linear test Navigation - */ - describe('Linear Test Navigation', () => { - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Admin login - * - Import and publish e2e example test - * - Set guest access on delivery and save - * - Logout - */ - before(() => { - if (Cypress.env('bypassBackOffice') !== "true") { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64LinearTest, 'e2e navigation linear test'); - cy.publishTest('e2e navigation linear test'); - cy.setDeliveryForGuests('e2e navigation linear test'); - cy.logout(); - } - }); - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Guest login - * - Start test - */ - beforeEach(() => { - cy.setupServer(); - cy.addRunnerRoutes(); - cy.guestLogin(); - cy.startTest('e2e navigation linear test'); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - if (Cypress.env('bypassBackOffice') !== "true") { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem('e2e navigation linear test'); - cy.deleteTest('e2e navigation linear test'); - cy.deleteDelivery('e2e navigation linear test'); - } - }); - - describe('First Item', () => { - - it('Has proper navigation buttons', function () { - cy.get('.navi-box-list').within(() => { - // visible navigation buttons - cy.get(navigationSelectors.testNavigation.nextItem).should('exist').and('be.visible'); - cy.get(navigationSelectors.testNavigation.skipItem).should('exist').and('be.visible'); - - // not visible navigation buttons - cy.get(navigationSelectors.testNavigation.previousItem).should('exist').and('not.be.visible'); - - //not existing buttons - cy.get(navigationSelectors.testNavigation.endTest).should('not.exist'); - cy.get(navigationSelectors.testNavigation.skipAndEndTest).should('not.exist'); - }); - }); - - it('Move to next item', cy.nextItem); - - it('Skip to next item', cy.skipItem); - - }); - - describe('Second Item', () => { - - it('Has proper navigation buttons', function () { - // go to 2nd item - cy.nextItem(); - - cy.get('.navi-box-list').within(() => { - // visible navigation buttons - cy.get(navigationSelectors.testNavigation.nextItem).should('exist').and('be.visible'); - cy.get(navigationSelectors.testNavigation.skipItem).should('exist').and('be.visible'); - - // not visible navigation buttons - cy.get(navigationSelectors.testNavigation.previousItem).should('exist').and('not.be.visible'); - - //not existing buttons - cy.get(navigationSelectors.testNavigation.endTest).should('not.exist'); - cy.get(navigationSelectors.testNavigation.skipAndEndTest).should('not.exist'); - }); - }); - - it('Move to next item', () => { - // go to 2nd item - cy.nextItem(); - - // go to next item - cy.nextItem(); - }); - - it('Skip to next item', () => { - // go to 2nd item - cy.nextItem(); - - // skip item - cy.skipItem(); - }); - - }); - - describe('Last Item', () => { - it('Has proper navigation buttons', function () { - - // go to last item - cy.nextItem(); - cy.nextItem(); - - cy.get('.navi-box-list').within(() => { - // visible navigation buttons - cy.get(navigationSelectors.testNavigation.endTest).should('exist').and('be.visible'); - cy.get(navigationSelectors.testNavigation.skipAndEndTest).should('exist').and('be.visible'); - - // not visible navigation buttons - cy.get(navigationSelectors.testNavigation.previousItem).should('exist').and('not.be.visible'); - - //not existing buttons - cy.get(navigationSelectors.testNavigation.skipItem).should('not.exist'); - cy.get(navigationSelectors.testNavigation.nextItem).should('not.exist'); - }); - }); - - it('End test', () => { - // go to last item - cy.nextItem(); - cy.nextItem(); - - // end test - cy.endTest(); - - //check if the test is really ended - cy.location().should((loc) => { - expect(loc.pathname).to.eq(runnerUrls.availableDeliveriesPageUrl); - }); - }); - - it('Skip and end test', () => { - // go to last item - cy.nextItem(); - cy.nextItem(); - - // skip and end test - cy.skipAndEndTest(); - - //check if the test is really ended - cy.location().should((loc) => { - expect(loc.pathname).to.eq(runnerUrls.availableDeliveriesPageUrl); - }); - }); - - }); - - }); - - describe('Non Linear Test Navigation', () => { - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Admin login - * - Import and publish e2e example test - * - Set guest access on delivery and save - * - Logout - */ - before(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.importTestPackage(base64NonLinearTest, 'e2e navigation non linear test'); - cy.publishTest('e2e navigation non linear test'); - cy.setDeliveryForGuests('e2e navigation non linear test'); - cy.logout(); - }); - - /** - * Setup to have a proper delivery: - * - Start server - * - Add necessary routes - * - Guest login - * - Start test - */ - beforeEach(() => { - cy.setupServer(); - cy.addRunnerRoutes(); - cy.guestLogin(); - cy.startTest('e2e navigation non linear test'); - }); - - /** - * Destroy everything we created during setup, leaving the environment clean for next time. - */ - after(() => { - cy.setupServer(); - cy.addBackOfficeRoutes(); - cy.login('admin'); - cy.deleteItem('e2e navigation non linear test'); - cy.deleteTest('e2e navigation non linear test'); - cy.deleteDelivery('e2e navigation non linear test'); - }); - - describe('First Item', () => { - - it('Has proper navigation buttons', function () { - cy.get('.navi-box-list').within(() => { - // visible navigation buttons - cy.get(navigationSelectors.testNavigation.nextItem).should('exist').and('be.visible'); - cy.get(navigationSelectors.testNavigation.skipItem).should('exist').and('be.visible'); - - // not visible navigation buttons - cy.get(navigationSelectors.testNavigation.previousItem).should('exist').and('not.be.visible'); - - //not existing buttons - cy.get(navigationSelectors.testNavigation.endTest).should('not.exist'); - cy.get(navigationSelectors.testNavigation.skipAndEndTest).should('not.exist'); - }); - }); - - it('Move to next item', cy.nextItem); - - it('Skip to next item', cy.skipItem); - - }); - - describe('Second Item', () => { - - it('Has proper navigation buttons', function () { - // go to 2nd item - cy.nextItem(); - - cy.get('.navi-box-list').within(() => { - // visible navigation buttons - cy.get(navigationSelectors.testNavigation.nextItem).should('exist').and('be.visible'); - cy.get(navigationSelectors.testNavigation.skipItem).should('exist').and('be.visible'); - cy.get(navigationSelectors.testNavigation.previousItem).should('exist').and('be.visible'); - - //not existing buttons - cy.get(navigationSelectors.testNavigation.endTest).should('not.exist'); - cy.get(navigationSelectors.testNavigation.skipAndEndTest).should('not.exist'); - }); - }); - - it('Move to next item', () => { - // go to 2nd item - cy.nextItem(); - - // go to next item - cy.nextItem(); - }); - - it('Skip to next item', () => { - // go to 2nd item - cy.nextItem(); - - // skip item - cy.skipItem(); - }); - - it('Move to previous item', () => { - // go to 2nd item - cy.nextItem(); - - // go to previous item - cy.previousItem(); - }); - - }); - - describe('Last Item', () => { - it('Has proper navigation buttons', function () { - - // go to last item - cy.nextItem(); - cy.nextItem(); - - cy.get('.navi-box-list').within(() => { - // visible navigation buttons - cy.get(navigationSelectors.testNavigation.endTest).should('exist').and('be.visible'); - cy.get(navigationSelectors.testNavigation.skipAndEndTest).should('exist').and('be.visible'); - cy.get(navigationSelectors.testNavigation.previousItem).should('exist').and('be.visible'); - - //not existing buttons - cy.get(navigationSelectors.testNavigation.skipItem).should('not.exist'); - cy.get(navigationSelectors.testNavigation.nextItem).should('not.exist'); - }); - }); - - it('Move to previous item', () => { - // go to last item - cy.nextItem(); - cy.nextItem(); - - // go to previous item - cy.previousItem(); - }); - - it('End test', () => { - // go to last item - cy.nextItem(); - cy.nextItem(); - - // end test - cy.endTest(); - - //check if the test is really ended - cy.location().should((loc) => { - expect(loc.pathname).to.eq(runnerUrls.availableDeliveriesPageUrl); - }); - }); - - it('Skip and end test', () => { - // go to last item - cy.nextItem(); - cy.nextItem(); - - // skip and end test - cy.skipAndEndTest(); - - //check if the test is really ended - cy.location().should((loc) => { - expect(loc.pathname).to.eq(runnerUrls.availableDeliveriesPageUrl); - }); - }); - - }); - - }); - -});