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: Add e2e tests for git exercise participation using ssh and token #10006

Merged
merged 38 commits into from
Dec 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
7e726a9
Add test for programming exercise submissions through git using token…
muradium Nov 25, 2024
a2caef0
Revert "Add test for programming exercise submissions through git usi…
muradium Nov 26, 2024
83ee372
Add test for programming exercise submissions through git using token…
muradium Nov 26, 2024
52b0def
Don't modify url in token based cloning, log repo url
muradium Nov 26, 2024
93a0015
Add test that uses SSH for participating in programming exercise
muradium Nov 30, 2024
92fbab5
Modify git clone url to include artemis-app for https with token on CI
muradium Dec 2, 2024
5635139
Accept the connection to ssh host and add it to known_hosts automatic…
muradium Dec 5, 2024
8cf9a86
Enable verbose mode
muradium Dec 6, 2024
8ecf5a4
Use container name instead of server url for ssh-based cloning
muradium Dec 6, 2024
f0a7d7c
Expose port 8080 to localhost machine on CI and use default Git url i…
muradium Dec 10, 2024
82f3188
Move port changes to correct compose file
muradium Dec 10, 2024
be846ac
Remove 7921 port mapping as it's mapped for nginx
muradium Dec 10, 2024
275bcf6
Switch playwright container to host network mode
muradium Dec 10, 2024
8ffd208
Revert "Switch playwright container to host network mode"
muradium Dec 10, 2024
50d3571
Revert "Remove 7921 port mapping as it's mapped for nginx"
muradium Dec 10, 2024
d0238fe
Revert "Move port changes to correct compose file"
muradium Dec 10, 2024
d0e8af4
Revert "Expose port 8080 to localhost machine on CI and use default G…
muradium Dec 10, 2024
a12367f
Remove git token test to delegate it to another branch
muradium Dec 11, 2024
8517c5b
Merge branch 'develop' into feature/playwright/test-ssh-token-clone
muradium Dec 12, 2024
bd7a698
Changes to correspond to updated SSH settings of Artemis
muradium Dec 12, 2024
30d7157
Use pre-generated ssh certificates during e2e testing
muradium Dec 12, 2024
293be08
Revert "Use pre-generated ssh certificates during e2e testing"
muradium Dec 12, 2024
754573a
Set up pre-generated ssh keys using a global playwright script
muradium Dec 12, 2024
580431b
Create .ssh folder if it does not exist
muradium Dec 12, 2024
36c59e6
Fix typo in test script
muradium Dec 12, 2024
25279b4
Improve ssh server url regex
muradium Dec 14, 2024
2da66d4
Small code improvements
muradium Dec 14, 2024
891bf7b
Add ED25519 test
muradium Dec 14, 2024
2f8ecfd
Merge branch 'develop' into feature/playwright/test-ssh-token-clone
muradium Dec 14, 2024
3e686af
Update src/test/playwright/init/global-setup.ts
muradium Dec 14, 2024
3fba5ac
Error handling on global-setup
muradium Dec 14, 2024
13ad227
Improve management of ssh keys by using them directly from Playwright…
muradium Dec 14, 2024
ec012fa
Minor code improvements
muradium Dec 14, 2024
02f6798
Avoid modifying server url on all git submission tests
muradium Dec 15, 2024
6c9eb4b
Adds programming submission test that uses token-based HTTPS
muradium Dec 15, 2024
346080a
Close ssh settings page after setting up ssh keys
muradium Dec 15, 2024
6af526c
Merge branch 'develop' into feature/playwright/test-ssh-token-clone
muradium Dec 15, 2024
9fff192
Merge branch 'develop' into feature/playwright/test-ssh-token-clone
krusche Dec 20, 2024
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ data-exports/
######################
/src/test/playwright/test-reports/
/src/test/playwright/test-results/*
/src/test/playwright/ssh-keys/known_hosts
muradium marked this conversation as resolved.
Show resolved Hide resolved

#################################
# Files generated by prebuild.mjs
Expand Down
4 changes: 3 additions & 1 deletion docker/artemis/config/playwright-local.env
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------------------------------------------------
# Artemis configuration overrides for the Playwright E2E Postgres setups
# Artemis configuration overrides for the Playwright E2E Local CI/VC setups
# ----------------------------------------------------------------------------------------------------------------------

SPRING_PROFILES_ACTIVE="artemis,scheduling,localvc,localci,buildagent,core,prod,docker"
Expand All @@ -12,3 +12,5 @@ ARTEMIS_CONTINUOUSINTEGRATION_ARTEMISAUTHENTICATIONTOKENVALUE='demo'
ARTEMIS_CONTINUOUSINTEGRATION_DOCKERCONNECTIONURI='unix:///var/run/docker.sock'
ARTEMIS_GIT_NAME='artemis'
ARTEMIS_GIT_EMAIL='artemis@example.com'
ARTEMIS_VERSIONCONTROL_SSHHOSTKEYPATH='/app/artemis/src/test/playwright/ssh-keys'
ARTEMIS_VERSIONCONTROL_SSHPORT='7921'
2 changes: 2 additions & 0 deletions docker/playwright-E2E-tests-mysql-localci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ services:
condition: service_healthy
environment:
PLAYWRIGHT_DB_TYPE: 'MySQL'
network_mode: service:artemis-app
networks: !reset []

networks:
artemis:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ <h5>{{ cloneHeadline | artemisTranslate }}</h5>
[disabled]="!copyEnabled"
[class.btn-success]="wasCopied"
class="btn btn-primary btn-sm me-2"
data-testid="copyRepoUrlButton"
type="button"
style="min-width: 100px"
jhiTranslate="{{ wasCopied ? 'artemisApp.exerciseActions.copiedUrl' : 'artemisApp.exerciseActions.copyUrl' }}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ <h1 jhiTranslate="artemisApp.userSettings.sshSettingsPage.addNewSshKey"></h1>
</div>
}
<div>
<textarea class="form-control" rows="10" [readonly]="!isCreateMode" [(ngModel)]="displayedSshKey"></textarea>
<textarea class="form-control" rows="10" [readonly]="!isCreateMode" [(ngModel)]="displayedSshKey" data-testid="sshKeyField"></textarea>
</div>

<!-- input fields for key creation -->
Expand Down Expand Up @@ -121,6 +121,7 @@ <h1 jhiTranslate="artemisApp.userSettings.sshSettingsPage.addNewSshKey"></h1>
[icon]="faSave"
[title]="'artemisApp.userSettings.sshSettingsPage.saveSshKey'"
(onClick)="saveSshKey()"
data-testid="saveSshKeyButton"
/>
</div>
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ <h4 class="text-center mb-4 mt-8" jhiTranslate="artemisApp.userSettings.sshSetti
</div>

<div class="d-flex justify-content-center mb-4">
<a class="btn btn-primary rounded-btn" [routerLink]="['add']">
<a class="btn btn-primary rounded-btn" data-testid="addNewSshKeyButton" [routerLink]="['add']">
<span jhiTranslate="artemisApp.userSettings.sshSettingsPage.addNewSshKey"></span>
</a>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,20 @@ import javaAllSuccessfulSubmission from '../../../fixtures/exercise/programming/
import javaBuildErrorSubmission from '../../../fixtures/exercise/programming/java/build_error/submission.json';
import javaPartiallySuccessfulSubmission from '../../../fixtures/exercise/programming/java/partially_successful/submission.json';
import pythonAllSuccessful from '../../../fixtures/exercise/programming/python/all_successful/submission.json';
import { ExerciseCommit, ExerciseMode, ProgrammingLanguage } from '../../../support/constants';
import { BASE_API, ExerciseCommit, ExerciseMode, ProgrammingLanguage } from '../../../support/constants';
import { test } from '../../../support/fixtures';
import { Page, expect } from '@playwright/test';
import { gitClient } from '../../../support/pageobjects/exercises/programming/GitClient';
import { BrowserContext, Page, expect } from '@playwright/test';
import { SSH_KEYS_PATH, SSH_KEY_NAMES, SshEncryptionAlgorithm, gitClient } from '../../../support/pageobjects/exercises/programming/GitClient';
import * as fs from 'fs/promises';
import path from 'path';
import { SimpleGit } from 'simple-git';
import { Fixtures } from '../../../fixtures/fixtures';
import { createFileWithContent } from '../../../support/utils';
import { ProgrammingExerciseSubmission } from '../../../support/pageobjects/exercises/programming/OnlineEditorPage';
import cAllSuccessful from '../../../fixtures/exercise/programming/c/all_successful/submission.json';
import { UserCredentials, admin, instructor, studentFour, studentOne, studentTwo, tutor } from '../../../support/users';
import { Team } from 'app/entities/team.model';
import { ProgrammingExerciseOverviewPage } from '../../../support/pageobjects/exercises/programming/ProgrammingExerciseOverviewPage';
import { GitCloneMethod, ProgrammingExerciseOverviewPage } from '../../../support/pageobjects/exercises/programming/ProgrammingExerciseOverviewPage';
import { Participation } from 'app/entities/participation/participation.model';

test.describe('Programming exercise participation', { tag: '@sequential' }, () => {
Expand Down Expand Up @@ -80,14 +81,60 @@ test.describe('Programming exercise participation', { tag: '@sequential' }, () =
});
});

test('Makes a submission using git', async ({ page, programmingExerciseOverview }) => {
test('Makes a git submission through HTTPS', async ({ page, programmingExerciseOverview }) => {
await programmingExerciseOverview.startParticipation(course.id!, exercise.id!, studentOne);
await makeGitExerciseSubmission(page, programmingExerciseOverview, course, exercise, studentOne, submission, commitMessage);
});
});
}
}

test.describe('Programming exercise participation using secure git', () => {
let exercise: ProgrammingExercise;

test.beforeEach('Setup programming exercise', async ({ login, exerciseAPIRequests }) => {
await login(admin);
exercise = await exerciseAPIRequests.createProgrammingExercise({ course, programmingLanguage: ProgrammingLanguage.JAVA });
});

test('Makes a git submission through HTTPS using token', async ({ programmingExerciseOverview, page }) => {
await programmingExerciseOverview.startParticipation(course.id!, exercise.id!, studentOne);
await makeGitExerciseSubmission(
page,
programmingExerciseOverview,
course,
exercise,
studentOne,
javaAllSuccessfulSubmission,
'Solution',
GitCloneMethod.httpsWithToken,
);
});

test.describe('Programming exercise participation using SSH', () => {
for (const sshAlgorithm of [SshEncryptionAlgorithm.rsa, SshEncryptionAlgorithm.ed25519]) {
test(`Makes a git submission using SSH with ${sshAlgorithm} key`, async ({ page, programmingExerciseOverview }) => {
await programmingExerciseOverview.startParticipation(course.id!, exercise.id!, studentOne);
await makeGitExerciseSubmission(
page,
programmingExerciseOverview,
course,
exercise,
studentOne,
javaAllSuccessfulSubmission,
'Solution',
GitCloneMethod.ssh,
sshAlgorithm,
);
});
}

test.afterEach('Delete SSH key', async ({ accountManagementAPIRequests }) => {
await accountManagementAPIRequests.deleteSshPublicKey();
});
});
});

test.describe('Programming exercise team participation', () => {
let exercise: ProgrammingExercise;
let participation: Participation;
Expand Down Expand Up @@ -234,23 +281,53 @@ async function makeGitExerciseSubmission(
student: UserCredentials,
submission: any,
commitMessage: string,
cloneMethod: GitCloneMethod = GitCloneMethod.https,
sshAlgorithm: SshEncryptionAlgorithm = SshEncryptionAlgorithm.ed25519,
) {
let repoUrl = await programmingExerciseOverview.getRepoUrl();
if (process.env.CI === 'true') {
repoUrl = repoUrl.replace('localhost', 'artemis-app');
await programmingExerciseOverview.openCloneMenu(cloneMethod);
if (cloneMethod == GitCloneMethod.ssh) {
await expect(programmingExerciseOverview.getCloneUrlButton()).toBeDisabled();
const sshKeyNotFoundAlert = page.locator('.alert', { hasText: 'To use ssh, you need to add an ssh key to your account' });
await expect(sshKeyNotFoundAlert).toBeVisible();
await setupSSHCredentials(page.context(), sshAlgorithm);
await page.reload();
await programmingExerciseOverview.openCloneMenu(cloneMethod);
}
let repoUrl = await programmingExerciseOverview.copyCloneUrl();
if (cloneMethod == GitCloneMethod.https) {
repoUrl = repoUrl.replace(student.username!, `${student.username!}:${student.password!}`);
}
repoUrl = repoUrl.replace(student.username!, `${student.username!}:${student.password!}`);
repoUrl = repoUrl.replace(`:**********`, ``);
console.log(`Cloning repository from ${repoUrl}`);
const urlParts = repoUrl.split('/');
const repoName = urlParts[urlParts.length - 1];
const exerciseRepo = await gitClient.cloneRepo(repoUrl, repoName);
let exerciseRepo;
if (cloneMethod == GitCloneMethod.ssh) {
exerciseRepo = await gitClient.cloneRepo(repoUrl, repoName, SSH_KEY_NAMES[sshAlgorithm]);
} else {
exerciseRepo = await gitClient.cloneRepo(repoUrl, repoName);
}
muradium marked this conversation as resolved.
Show resolved Hide resolved
console.log(`Cloned repository successfully. Pushing files...`);
await pushGitSubmissionFiles(exerciseRepo, repoName, student, submission, commitMessage);
await fs.rmdir(`./test-exercise-repos/${repoName}`, { recursive: true });
await page.goto(`courses/${course.id}/exercises/${exercise.id!}`);
const resultScore = await programmingExerciseOverview.getResultScore();
await expect(resultScore.getByText(submission.expectedResult)).toBeVisible();
}

async function setupSSHCredentials(context: BrowserContext, sshAlgorithm: SshEncryptionAlgorithm) {
console.log(`Setting up SSH credentials with key ${SSH_KEY_NAMES[sshAlgorithm]}`);
const page = await context.newPage();
const sshKeyPath = path.join(SSH_KEYS_PATH, `${SSH_KEY_NAMES[sshAlgorithm]}.pub`);
const sshKey = await fs.readFile(sshKeyPath, 'utf8');
await page.goto('user-settings/ssh');
await page.getByTestId('addNewSshKeyButton').click();
await page.getByTestId('sshKeyField').fill(sshKey!);
const responsePromise = page.waitForResponse(`${BASE_API}/ssh-settings/public-key`);
await page.getByTestId('saveSshKeyButton').click();
await responsePromise;
await page.close();
}

/**
* Helper function to make a submission to a git repository.
* @param exerciseRepo - The git repository to which the submission should be made.
Expand Down
24 changes: 24 additions & 0 deletions src/test/playwright/init/global-setup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import fs from 'fs';
import path from 'path';
import { SSH_KEYS_PATH, SSH_KEY_NAMES } from '../support/pageobjects/exercises/programming/GitClient';

async function globalSetup() {
console.log('Running global setup...');

// Set correct permissions to the SSH keys
try {
for (const keyName of Object.values(SSH_KEY_NAMES)) {
const privateKeyPath = path.join(SSH_KEYS_PATH, keyName);
const publicKeyPath = `${privateKeyPath}.pub`;

fs.chmodSync(privateKeyPath, 0o600);
fs.chmodSync(publicKeyPath, 0o644);
}
} catch (error) {
console.error('Error during SSH key setup:', error);
}
muradium marked this conversation as resolved.
Show resolved Hide resolved

console.log('Global setup completed.');
}

export default globalSetup;
1 change: 1 addition & 0 deletions src/test/playwright/playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export default defineConfig({
workers: parseNumber(process.env.TEST_WORKER_PROCESSES) ?? 3,
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
reporter: [['junit', { outputFile: process.env.PLAYWRIGHT_JUNIT_OUTPUT_NAME ?? './test-reports/results.xml' }]],
globalSetup: require.resolve('./init/global-setup.ts'),

/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
Expand Down
7 changes: 7 additions & 0 deletions src/test/playwright/ssh-keys/artemis_playwright_ed25519
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACA/OcbXN1QDtJhP1seN+9NmL1HuMnyBxOawYkPQJHqq0gAAAKCY71cGmO9X
BgAAAAtzc2gtZWQyNTUxOQAAACA/OcbXN1QDtJhP1seN+9NmL1HuMnyBxOawYkPQJHqq0g
AAAEC6t3RGmhqZySk/v7b9YbncJW1LVVoz4qPae+ktj+HwKz85xtc3VAO0mE/Wx43702Yv
Ue4yfIHE5rBiQ9AkeqrSAAAAFmFydGVtaXNfcGxheXdyaWdodF9zc2gBAgMEBQYH
-----END OPENSSH PRIVATE KEY-----
muradium marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID85xtc3VAO0mE/Wx43702YvUe4yfIHE5rBiQ9AkeqrS artemis_playwright_ssh
49 changes: 49 additions & 0 deletions src/test/playwright/ssh-keys/artemis_playwright_rsa
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
1 change: 1 addition & 0 deletions src/test/playwright/ssh-keys/artemis_playwright_rsa.pub
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC/v5RnrbWY09t28SFEGc1g535+3C7FX0XwFFG0dQbzuUdrZhcB4RrV2czhuiZVWzw0lio7wTDof6K+G6CjbUQ7vFK8JWSH8pN9edRYossWV87ZNTE1aUG73GfznmoOzrDXXei6S/FTk3buoud5dj+DJllkvB/3rFOn0CZW2xrdJhUvaAtKRDVLRQZlrUeOxWpoSRDOnRomHN1b+V+YYHg7CFY/MxsOpPYwr8Bk42HZlGoMgK3m1HTotiE6exK7Rvo7tT2wd7zp9HNh+sAYrlxDqXW6G0QQNblEavcOMccWq5XqE1xuaFaeCR9LZLyenYuXPj7TUwoWcUI9DT94QUJmoEbtP37HzGpFxvqIWWJuGlZWYBanz/U6rjmckAjh/n17FcLOCIfrQT226XybripcqLBPVBvV7odurkfr2+rrw4NaBa1tetyFDfxE+pebWZEzMgtc7TJLpyTyYHLltOPLtRImH6w9hlOX7Jtn6Azk7n2PZ7ctFmq+MiASBQ/pVwY6f3lh7o+fLYt+dOkdQTdDq2bygub6n9/rHLNH0LWqOgKFEEAgfh9CcdWJvGuSsQWrynPfG7WboRsHafLKAaCQLqVhSbMWcIjY5zmDIerhcC8tjIRAqgcW/tCHugg+0JB59ayC18FQNH3baOMsm0C2oYZfA6TomYFRkldErByheQ== artemis_playwright_ssh
5 changes: 5 additions & 0 deletions src/test/playwright/support/fixtures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ import { QuizExerciseOverviewPage } from './pageobjects/exercises/quiz/QuizExerc
import { QuizExerciseParticipationPage } from './pageobjects/exercises/quiz/QuizExerciseParticipationPage';
import { ModalDialogBox } from './pageobjects/exam/ModalDialogBox';
import { ExamParticipationActions } from './pageobjects/exam/ExamParticipationActions';
import { AccountManagementAPIRequests } from './requests/AccountManagementAPIRequests';
import { EditExamPage } from './pageobjects/exam/EditExamPage';

/*
Expand Down Expand Up @@ -143,6 +144,7 @@ export type ArtemisPageObjects = {
};

export type ArtemisRequests = {
accountManagementAPIRequests: AccountManagementAPIRequests;
courseManagementAPIRequests: CourseManagementAPIRequests;
userManagementAPIRequests: UserManagementAPIRequests;
exerciseAPIRequests: ExerciseAPIRequests;
Expand Down Expand Up @@ -366,6 +368,9 @@ export const test = base.extend<ArtemisPageObjects & ArtemisCommands & ArtemisRe
exerciseTeams: async ({ page }, use) => {
await use(new ExerciseTeamsPage(page));
},
accountManagementAPIRequests: async ({ page }, use) => {
await use(new AccountManagementAPIRequests(page));
},
courseManagementAPIRequests: async ({ page }, use) => {
await use(new CourseManagementAPIRequests(page));
},
Expand Down
Loading
Loading