Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Development: Improve exercise import e2e tests #10305

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions src/test/playwright/e2e/exercise/ExerciseImport.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ test.describe('Import exercises', () => {
await courseManagementExercises.importTextExercise();
await courseManagementExercises.clickImportExercise(textExercise.id!);

await textExerciseCreation.waitForFormToLoad();
await expect(page.locator('#field_title')).toHaveValue(textExercise.title!);
await expect(page.locator('#field_points')).toHaveValue(`${textExercise.maxPoints!}`);

Expand Down Expand Up @@ -74,10 +75,11 @@ test.describe('Import exercises', () => {
await courseManagementExercises.importQuizExercise();
await courseManagementExercises.clickImportExercise(quizExercise.id!);

await quizExerciseCreation.waitForFormToLoad();
await expect(page.locator('#field_title')).toHaveValue(quizExercise.title!);
await expect(page.locator('#quiz-duration-minutes')).toHaveValue(`${quizExercise.duration! / 60}`);

await quizExerciseCreation.setVisibleFrom(dayjs());
await quizExerciseCreation.setReleaseDate(dayjs());

const importResponse = await quizExerciseCreation.import();
const exercise: QuizExercise = await importResponse.json();
Expand All @@ -100,7 +102,7 @@ test.describe('Import exercises', () => {
await courseManagementExercises.importModelingExercise();
await courseManagementExercises.clickImportExercise(modelingExercise.id!);

await page.waitForTimeout(10000);
await modelingExerciseCreation.waitForFormToLoad();
await expect(page.locator('#field_title')).toHaveValue(modelingExercise.title!);
await expect(page.locator('#field_points')).toHaveValue(`${modelingExercise.maxPoints!}`);

Expand Down Expand Up @@ -131,6 +133,7 @@ test.describe('Import exercises', () => {
await courseManagementExercises.importProgrammingExercise();
await courseManagementExercises.clickImportExercise(programmingExercise.id!);

await programmingExerciseCreation.waitForFormToLoad();
await expect(page.locator('#field_points')).toHaveValue(`${programmingExercise.maxPoints!}`);

await programmingExerciseCreation.setTitle('Import Test');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ test.describe('File upload exercise management', { tag: '@fast' }, () => {

// Fill out file upload exercise form
const exerciseTitle = 'file upload exercise' + generateUUID();
await fileUploadExerciseCreation.typeTitle(exerciseTitle);
await fileUploadExerciseCreation.setTitle(exerciseTitle);
await fileUploadExerciseCreation.setReleaseDate(dayjs());
await fileUploadExerciseCreation.setDueDate(dayjs().add(1, 'days'));
await fileUploadExerciseCreation.setAssessmentDueDate(dayjs().add(2, 'days'));
Expand Down
6 changes: 3 additions & 3 deletions src/test/playwright/support/fixtures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import { ProgrammingExerciseCreationPage } from './pageobjects/exercises/program
import { QuizExerciseCreationPage } from './pageobjects/exercises/quiz/QuizExerciseCreationPage';
import { StudentExamManagementPage } from './pageobjects/exam/StudentExamManagementPage';
import { TextExerciseCreationPage } from './pageobjects/exercises/text/TextExerciseCreationPage';
import { CreateModelingExercisePage } from './pageobjects/exercises/modeling/CreateModelingExercisePage';
import { ModelingExerciseCreationPage } from './pageobjects/exercises/modeling/ModelingExerciseCreationPage';
import { ExamTestRunPage } from './pageobjects/exam/ExamTestRunPage';
import { CourseManagementExercisesPage } from './pageobjects/course/CourseManagementExercisesPage';
import { TextExerciseExampleSubmissionsPage } from './pageobjects/exercises/text/TextExerciseExampleSubmissionsPage';
Expand Down Expand Up @@ -115,7 +115,7 @@ export type ArtemisPageObjects = {
fileUploadExerciseCreation: FileUploadExerciseCreationPage;
fileUploadExerciseEditor: FileUploadEditorPage;
fileUploadExerciseFeedback: FileUploadExerciseFeedbackPage;
modelingExerciseCreation: CreateModelingExercisePage;
modelingExerciseCreation: ModelingExerciseCreationPage;
modelingExerciseEditor: ModelingEditor;
modelingExerciseFeedback: ModelingExerciseFeedbackPage;
programmingExerciseCreation: ProgrammingExerciseCreationPage;
Expand Down Expand Up @@ -292,7 +292,7 @@ export const test = base.extend<ArtemisPageObjects & ArtemisCommands & ArtemisRe
await use(new FileUploadExerciseFeedbackPage(page));
},
modelingExerciseCreation: async ({ page }, use) => {
await use(new CreateModelingExercisePage(page));
await use(new ModelingExerciseCreationPage(page));
},
modelingExerciseEditor: async ({ page }, use) => {
await use(new ModelingEditor(page));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { Locator, Page } from '@playwright/test';
import { Dayjs } from 'dayjs';
import { enterDate } from '../../utils';

export class AbstractExerciseCreationPage {
protected readonly page: Page;

constructor(page: Page) {
this.page = page;
}

async setTitle(title: string) {
const titleField = this.page.locator('#field_title');
await titleField.clear();
await titleField.fill(title);
}

async setReleaseDate(date: Dayjs) {
await enterDate(this.page, '#pick-releaseDate', date);
}

async setDueDate(date: Dayjs) {
await enterDate(this.page, '#pick-dueDate', date);
}

async setAssessmentDueDate(date: Dayjs) {
await enterDate(this.page, '#pick-assessmentDueDate', date);
}

async clearText(textEditor: Locator) {
await textEditor.click();
await textEditor.press('Control+a');
await textEditor.press('Delete');
}

async waitForFormToLoad() {
await this.page.locator('[name*="editForm"]').waitFor({ state: 'visible', timeout: 10000 });
}
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,7 @@
import { Page } from 'playwright';
import { UPLOAD_EXERCISE_BASE } from '../../../constants';
import { Dayjs } from 'dayjs';
import { enterDate } from '../../../utils';

export class FileUploadExerciseCreationPage {
private readonly page: Page;

constructor(page: Page) {
this.page = page;
}

async typeTitle(title: string) {
await this.page.locator('#field_title').fill(title);
}

async setReleaseDate(date: Dayjs) {
await enterDate(this.page, '#pick-releaseDate', date);
}

async setDueDate(date: Dayjs) {
await enterDate(this.page, '#pick-dueDate', date);
}

async setAssessmentDueDate(date: Dayjs) {
await enterDate(this.page, '#pick-assessmentDueDate', date);
}
import { AbstractExerciseCreationPage } from '../AbstractExerciseCreationPage';

export class FileUploadExerciseCreationPage extends AbstractExerciseCreationPage {
async typeMaxPoints(maxPoints: number) {
await this.page.locator('#field_points').fill(maxPoints.toString());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,7 @@
import { Page } from '@playwright/test';
import { MODELING_EXERCISE_BASE } from '../../../constants';
import { Dayjs } from 'dayjs';
import { enterDate } from '../../../utils';

export class CreateModelingExercisePage {
private readonly page: Page;

constructor(page: Page) {
this.page = page;
}

async setTitle(title: string) {
const titleField = this.page.locator('#field_title');
await titleField.clear();
await titleField.fill(title);
}
import { AbstractExerciseCreationPage } from '../AbstractExerciseCreationPage';

export class ModelingExerciseCreationPage extends AbstractExerciseCreationPage {
async addCategories(categories: string[]) {
for (const category of categories) {
const categoriesField = this.page.locator('#field_categories');
Expand All @@ -42,18 +28,6 @@ export class CreateModelingExercisePage {
return await responsePromise;
}

async setReleaseDate(date: Dayjs) {
await enterDate(this.page, '#pick-releaseDate', date);
}

async setDueDate(date: Dayjs) {
await enterDate(this.page, '#pick-dueDate', date);
}

async setAssessmentDueDate(date: Dayjs) {
await enterDate(this.page, '#pick-assessmentDueDate', date);
}

async includeInOverallScore(selection: string = 'No') {
await this.page.locator('#modeling-includeInScore-picker').locator('.btn', { hasText: selection }).click({ force: true });
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,11 @@
import { Locator, Page, expect } from '@playwright/test';
import { Locator, expect } from '@playwright/test';
import { PROGRAMMING_EXERCISE_BASE, ProgrammingLanguage } from '../../../constants';
import { Dayjs } from 'dayjs';
import { AbstractExerciseCreationPage } from '../AbstractExerciseCreationPage';

const OWL_DATEPICKER_ARIA_LABEL_DATE_FORMAT = 'MMMM D, YYYY';

export class ProgrammingExerciseCreationPage {
private readonly page: Page;

constructor(page: Page) {
this.page = page;
}

async setTitle(title: string) {
await this.page.locator('#field_title').fill(title);
}

export class ProgrammingExerciseCreationPage extends AbstractExerciseCreationPage {
async changeEditMode() {
await this.page.locator('#switch-edit-mode-button').click();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,12 @@
import { Page, expect } from '@playwright/test';
import { clearTextField, drag, enterDate } from '../../../utils';
import { Dayjs } from 'dayjs';
import { expect } from '@playwright/test';
import { clearTextField, drag } from '../../../utils';
import { QUIZ_EXERCISE_BASE } from '../../../constants';
import { Fixtures } from '../../../../fixtures/fixtures';
import { AbstractExerciseCreationPage } from '../AbstractExerciseCreationPage';

export class QuizExerciseCreationPage {
private readonly page: Page;
export class QuizExerciseCreationPage extends AbstractExerciseCreationPage {
private readonly DEFAULT_MULTIPLE_CHOICE_ANSWER_COUNT = 4;

constructor(page: Page) {
this.page = page;
}

async setTitle(title: string) {
await this.page.locator('#field_title').fill(title);
}

async setVisibleFrom(date: Dayjs) {
await enterDate(this.page, '#pick-releaseDate', date);
}

async addMultipleChoiceQuestion(title: string, points = 1) {
await this.page.locator('#quiz-add-mc-question').click();
await this.page.locator('#mc-question-title').fill(title);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,37 +1,18 @@
import { Locator, Page } from '@playwright/test';
import { Dayjs } from 'dayjs';
import { enterDate } from '../../../utils';
import { Locator } from '@playwright/test';
import { TEXT_EXERCISE_BASE } from '../../../constants';
import { AbstractExerciseCreationPage } from '../AbstractExerciseCreationPage';

export class TextExerciseCreationPage {
private readonly page: Page;

export class TextExerciseCreationPage extends AbstractExerciseCreationPage {
private readonly PROBLEM_STATEMENT_SELECTOR = '#problemStatement';
private readonly EXAMPLE_SOLUTION_SELECTOR = '#exampleSolution';
private readonly ASSESSMENT_INSTRUCTIONS_SELECTOR = '#gradingInstructions';

constructor(page: Page) {
this.page = page;
}

async typeTitle(title: string) {
const titleField = this.page.locator('#field_title');
await titleField.clear();
await titleField.fill(title);
}

muradium marked this conversation as resolved.
Show resolved Hide resolved
async setReleaseDate(date: Dayjs) {
await enterDate(this.page, '#pick-releaseDate', date);
}

async setDueDate(date: Dayjs) {
await enterDate(this.page, '#pick-dueDate', date);
}

async setAssessmentDueDate(date: Dayjs) {
await enterDate(this.page, '#pick-assessmentDueDate', date);
}

async typeMaxPoints(maxPoints: number) {
await this.page.locator('#field_points').fill(maxPoints.toString());
}
Expand Down Expand Up @@ -82,12 +63,6 @@ export class TextExerciseCreationPage {
return this.page.locator(selector).locator('.monaco-editor');
}

private async clearText(textEditor: Locator) {
await textEditor.click();
await textEditor.press('Control+a');
await textEditor.press('Delete');
}

private async typeText(textEditor: Locator, text: string) {
await textEditor.click();
await textEditor.pressSequentially(text);
Expand Down
Loading