diff --git a/test/authentication.test.ts b/test/authentication.test.ts index e2d9c37..d1b3acb 100644 --- a/test/authentication.test.ts +++ b/test/authentication.test.ts @@ -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 () => { diff --git a/test/config.ts b/test/config.ts new file mode 100644 index 0000000..1e75218 --- /dev/null +++ b/test/config.ts @@ -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 }) }; diff --git a/test/data_retrival.test.ts b/test/data_retrival.test.ts index d5c9145..cd0d2b4 100644 --- a/test/data_retrival.test.ts +++ b/test/data_retrival.test.ts @@ -1,68 +1,49 @@ -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); @@ -70,7 +51,7 @@ describe('helper data retrival', () => { }); 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); @@ -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(); @@ -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); }); }); diff --git a/test/globalSetup.ts b/test/globalSetup.ts new file mode 100644 index 0000000..66f0383 --- /dev/null +++ b/test/globalSetup.ts @@ -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; + } +} diff --git a/test/interaction.test.ts b/test/interaction.test.ts index 82acd4c..d172785 100644 --- a/test/interaction.test.ts +++ b/test/interaction.test.ts @@ -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); }); }); diff --git a/test/template.env b/test/template.env index d9b6664..9f9a1b5 100644 --- a/test/template.env +++ b/test/template.env @@ -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 diff --git a/vitest.config.ts b/vitest.config.ts index 3c988b5..bd73984 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -3,5 +3,6 @@ import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { retry: 1, + globalSetup: ['./test/globalSetup.ts'], }, });