Skip to content

Commit

Permalink
feat: improved testing
Browse files Browse the repository at this point in the history
  • Loading branch information
AsakuraMizu committed Jul 4, 2024
1 parent ba58aa9 commit cf2d68b
Show file tree
Hide file tree
Showing 7 changed files with 137 additions and 75 deletions.
6 changes: 1 addition & 5 deletions test/authentication.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
import { describe, it, expect } from 'vitest';
import * as dotenv from 'dotenv';
import { Learn2018Helper, FailReason } from '../src';

dotenv.config({ path: 'test/.env' });
const U = process.env.U!; // username
const P = process.env.P!; // password
import { U, P } from './config';

describe('helper authentication', () => {
it('should login & logout correctly if account is right', async () => {
Expand Down
8 changes: 8 additions & 0 deletions test/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import * as dotenv from 'dotenv';

dotenv.config({ path: 'test/.env' });

export const U = process.env.U!; // username
export const P = process.env.P!; // password

export const config = { provider: () => ({ username: U, password: P }) };
92 changes: 40 additions & 52 deletions test/data_retrival.test.ts
Original file line number Diff line number Diff line change
@@ -1,76 +1,57 @@
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
import * as dotenv from 'dotenv';
import { Learn2018Helper, CourseType, Language } from '../src';

dotenv.config({ path: 'test/.env' });
const U = process.env.U!; // username
const P = process.env.P!; // password
import { afterAll, beforeAll, describe, expect, inject, it } from 'vitest';
import { CourseType, Language, Learn2018Helper } from '../src';
import { config } from './config';

describe('helper data retrival', () => {
let helper: Learn2018Helper;
let semesterTester: string;
let courseTester: string;
let courseTATester: string;
const h = new Learn2018Helper(config);

beforeAll(async () => {
const _h = new Learn2018Helper();
await _h.login(U, P);
const currSemester = await _h.getCurrentSemester();
semesterTester = currSemester.id;
const courses = await _h.getCourseList(semesterTester);
expect(courses.length).toBeGreaterThanOrEqual(0);
const taCourses = await _h.getCourseList(semesterTester, CourseType.TEACHER);
expect(taCourses.length).toBeGreaterThanOrEqual(0);
if (courses.length > 0) {
courseTester = courses[0].id;
}
if (taCourses.length > 0) {
courseTATester = taCourses[0].id;
}
});
beforeAll(async () => {
helper = new Learn2018Helper();
await helper.login(U, P);
await h.login();
});
afterAll(async () => {
await helper.logout();
await h.logout();
});

const semesterTester = inject('S');
const courseTester = inject('C');
const semesterTATester = inject('ST');
const courseTATester = inject('CT');

it('should get correct language', async () => {
const lang = helper.getCurrentLanguage();
const lang = h.getCurrentLanguage();
expect(lang).toBeDefined();
const courses = await helper.getCourseList(semesterTester);
const courses = await h.getCourseList(semesterTester);
courses.forEach((course) => {
expect(course.name).toBe(lang === Language.EN ? course.englishName : course.chineseName);
});
});

it('should get semesterIdList correctly', async () => {
const semesters = await helper.getSemesterIdList();
const semesters = await h.getSemesterIdList();
expect(Array.isArray(semesters)).toEqual(true);
for (const semester of semesters) {
expect(typeof semester).toBe('string');
}
expect(semesters).toContain(semesterTester);
expect(semesters).toContain(semesterTATester);
});

it('should get currentSemester correctly', async () => {
const currSemester = await helper.getCurrentSemester();
const currSemester = await h.getCurrentSemester();
expect(currSemester).not.toBeUndefined();
expect(currSemester).not.toBeNull();
expect(currSemester.id).toEqual(semesterTester);
});

it('should get courseList correctly', async () => {
const courses = await helper.getCourseList(semesterTester);
const courses = await h.getCourseList(semesterTester);
expect(courses.length).toBeGreaterThanOrEqual(0);
if (courses.length > 0) {
expect(courses.map((c) => c.id)).toContain(courseTester);
}
});

it('should get TAcourses correctly', async () => {
const courses = await helper.getCourseList(semesterTester, CourseType.TEACHER);
const courses = await h.getCourseList(semesterTATester, CourseType.TEACHER);
expect(courses.length).toBeGreaterThanOrEqual(0);
if (courses.length > 0) {
expect(courses.map((c) => c.id)).toContain(courseTATester);
Expand All @@ -79,31 +60,38 @@ describe('helper data retrival', () => {

it('should get contents (or throw on unimplemented function) correctly', async () => {
if (courseTester !== undefined) {
expect((await helper.getHomeworkList(courseTester)).length).toBeGreaterThanOrEqual(0);
expect((await helper.getDiscussionList(courseTester)).length).toBeGreaterThanOrEqual(0);
expect((await helper.getNotificationList(courseTester)).length).toBeGreaterThanOrEqual(0);
expect((await helper.getFileList(courseTester)).length).toBeGreaterThanOrEqual(0);
expect((await helper.getAnsweredQuestionList(courseTester)).length).toBeGreaterThanOrEqual(0);
expect((await h.getHomeworkList(courseTester)).length).toBeGreaterThanOrEqual(0);
expect((await h.getDiscussionList(courseTester)).length).toBeGreaterThanOrEqual(0);
expect((await h.getNotificationList(courseTester)).length).toBeGreaterThanOrEqual(0);
expect((await h.getFileList(courseTester)).length).toBeGreaterThanOrEqual(0);
expect((await h.getAnsweredQuestionList(courseTester)).length).toBeGreaterThanOrEqual(0);
}
if (courseTATester !== undefined) {
// expect((await helper.getDiscussionList(courseTATester, CourseType.TEACHER)).length).toBeGreaterThanOrEqual(0);
// expect((await helper.getNotificationList(courseTATester, CourseType.TEACHER)).length).toBeGreaterThanOrEqual(0);
expect((await helper.getFileList(courseTATester, CourseType.TEACHER)).length).toBeGreaterThanOrEqual(0);
// expect((await helper.getAnsweredQuestionList(courseTATester, CourseType.TEACHER)).length).toBeGreaterThanOrEqual(0);
expect((await helper.getHomeworkList(courseTATester, CourseType.TEACHER)).length).toBeGreaterThanOrEqual(0);
// expect((await h.getDiscussionList(courseTATester, CourseType.TEACHER)).length).toBeGreaterThanOrEqual(0);
// expect((await h.getNotificationList(courseTATester, CourseType.TEACHER)).length).toBeGreaterThanOrEqual(0);
expect((await h.getFileList(courseTATester, CourseType.TEACHER)).length).toBeGreaterThanOrEqual(0);
// expect((await h.getAnsweredQuestionList(courseTATester, CourseType.TEACHER)).length).toBeGreaterThanOrEqual(0);
expect((await h.getHomeworkList(courseTATester, CourseType.TEACHER)).length).toBeGreaterThanOrEqual(0);
}
});

it('should get file categories and list correctly', async () => {
if (courseTester !== undefined) {
const categories = await helper.getFileCategoryList(courseTester);
const categories = await h.getFileCategoryList(courseTester);
expect(categories.length).toBeGreaterThanOrEqual(0);
expect((await h.getFileListByCategory(courseTester, categories[0].id)).length).toBeGreaterThanOrEqual(0);
}
if (courseTATester !== undefined) {
const categories = await h.getFileCategoryList(courseTATester, CourseType.TEACHER);
expect(categories.length).toBeGreaterThanOrEqual(0);
expect((await helper.getFileListByCategory(courseTester, categories[0].id)).length).toBeGreaterThanOrEqual(0);
expect(
(await h.getFileListByCategory(courseTATester, categories[0].id, CourseType.TEACHER)).length,
).toBeGreaterThanOrEqual(0);
}
});

it('should get user info correctly', async () => {
const userInfo = await helper.getUserInfo();
const userInfo = await h.getUserInfo();
expect(userInfo).toBeDefined();

expect(userInfo.name).toBeTruthy();
Expand All @@ -114,7 +102,7 @@ describe('helper data retrival', () => {
});

it('should get calendar items correctly and throw on invalid response', async () => {
expect((await helper.getCalendar('20210501', '20210530')).length).toBeGreaterThanOrEqual(0);
// await expect(helper.getCalendar('gg', 'GG')).rejects.toHaveProperty('reason', FailReason.INVALID_RESPONSE);
expect((await h.getCalendar('20210501', '20210530')).length).toBeGreaterThanOrEqual(0);
// await expect(h.getCalendar('gg', 'GG')).rejects.toHaveProperty('reason', FailReason.INVALID_RESPONSE);
});
});
70 changes: 70 additions & 0 deletions test/globalSetup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import type { GlobalSetupContext } from 'vitest/node';
import { CourseType, Learn2018Helper } from '../src';
import { config } from './config';

/**
* find suitable semester and course for testing or read from environment variables
* this also works like a gate for skipping tests if no network connection or `OPENSSL_CONF` not correctly configured
*/
export default async function setup({ provide }: GlobalSetupContext) {
const h = new Learn2018Helper(config);

await h.login();

const findCourse = async (semesterId: string, courseType: CourseType) => {
const courses = await h.getCourseList(semesterId, courseType);
return courses.length > 0 ? courses[0].id : undefined;
};

let semesterTester = process.env.S;
let courseTester = process.env.C;
let semesterTATester = process.env.ST;
let courseTATester = process.env.CT;

if (!semesterTester) {
const semesters = await h.getSemesterIdList();
for (const semester of semesters) {
const course = await findCourse(semester, CourseType.STUDENT);
if (course) {
semesterTester = semester;
courseTester = course;
break;
}
}
semesterTester = semesterTester || semesters[0];
}
if (!courseTester) {
courseTester = await findCourse(semesterTester, CourseType.STUDENT);
}
provide('S', semesterTester);
provide('C', courseTester);

if (!semesterTATester) {
const semesters = await h.getSemesterIdList();
for (const semester of semesters) {
const course = await findCourse(semester, CourseType.TEACHER);
if (course) {
semesterTATester = semester;
courseTATester = course;
break;
}
}
semesterTATester = semesterTATester || semesters[0];
}
if (!courseTATester) {
courseTATester = await findCourse(semesterTATester, CourseType.TEACHER);
}
provide('ST', semesterTATester);
provide('CT', courseTATester);

await h.logout();
}

declare module 'vitest' {
export interface ProvidedContext {
S: string;
C: string | undefined;
ST: string;
CT: string | undefined;
}
}
31 changes: 13 additions & 18 deletions test/interaction.test.ts
Original file line number Diff line number Diff line change
@@ -1,33 +1,28 @@
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
import * as dotenv from 'dotenv';
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
import { Language, Learn2018Helper } from '../src';

dotenv.config({ path: 'test/.env' });
const U = process.env.U!; // username
const P = process.env.P!; // password
const configs = { provider: () => ({ username: U, password: P }) };
import { config } from './config';

describe('helper interaction', () => {
let helper: Learn2018Helper;
const h = new Learn2018Helper(config);

beforeAll(async () => {
helper = new Learn2018Helper(configs);
await h.login();
});
afterAll(async () => {
await helper.logout();
await h.logout();
});

it('should set lang', async () => {
await helper.login();
const pre_lang = helper.getCurrentLanguage();
await h.login();
const pre_lang = h.getCurrentLanguage();
const toset_lang = pre_lang === Language.EN ? Language.ZH : Language.EN;
await helper.setLanguage(toset_lang);
expect(helper.getCurrentLanguage()).toBe(toset_lang);
await h.setLanguage(toset_lang);
expect(h.getCurrentLanguage()).toBe(toset_lang);

await helper.logout();
await helper.login();
expect(helper.getCurrentLanguage()).toBe(toset_lang);
await h.logout();
await h.login();
expect(h.getCurrentLanguage()).toBe(toset_lang);

await helper.setLanguage(pre_lang);
await h.setLanguage(pre_lang);
});
});
4 changes: 4 additions & 0 deletions test/template.env
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# create another .env file under this (not root) folder and replace under config to yours.
U=yourTisnghuaUsername
P=yourTsinghuaPassword
S=semetster1
C=course1
ST=semester2
CT=course2
1 change: 1 addition & 0 deletions vitest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@ import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
retry: 1,
globalSetup: ['./test/globalSetup.ts'],
},
});

0 comments on commit cf2d68b

Please sign in to comment.