@@ -2,48 +2,95 @@ import { getMembershipService } from "./membership-service"
22import type { NTNUGroup } from "../feide/feide-groups-repository"
33import { describe , expect , it } from "vitest"
44import { subYears } from "date-fns"
5- import { getAcademicStart } from "@dotkomonline/types"
5+ import { getAcademicStart , getMembershipGrade , getNextAcademicStart , type Membership } from "@dotkomonline/types"
66import { getCurrentUTC } from "@dotkomonline/utils"
7+ import { TZDate } from "@date-fns/tz"
8+
9+ // This test data was gathered in 2026, so to be able to test membership we need a static date, since these dates are
10+ // relative to current date and would change with time. This only concerns the membership grade calculations. The year
11+ // calculations should remain constant throughout the years.
12+ const NOW = new TZDate ( 2026 , 1 , 23 , 12 , 0 , 0 , 0 )
713
814const getYearFromDelta = ( delta : number ) => subYears ( getAcademicStart ( getCurrentUTC ( ) ) , delta ) . getFullYear ( )
915
16+ const getMockMembershipFromDelta = ( type : Membership [ "type" ] , delta : number ) : Membership => {
17+ const start = subYears ( getAcademicStart ( NOW ) , delta )
18+
19+ return {
20+ end : getNextAcademicStart ( ) ,
21+ id : "123" ,
22+ specialization : "UNKNOWN" ,
23+ start,
24+ type,
25+ userId : "123" ,
26+ }
27+ }
28+
1029describe ( "Membership integration tests" , ( ) => {
1130 const membershipService = getMembershipService ( )
1231
1332 it ( "bachelor example 1" , async ( ) => {
1433 const { goal, courses } = BACHELOR . EXAMPLE_1
1534 const delta = membershipService . findBachelorStartYearDelta ( courses )
16- expect ( getYearFromDelta ( delta ) ) . toBe ( goal )
35+
36+ const year = getYearFromDelta ( delta )
37+ const membership = getMockMembershipFromDelta ( "BACHELOR_STUDENT" , delta )
38+
39+ expect ( year ) . toBe ( goal . year )
40+ expect ( getMembershipGrade ( membership ) ) . toBe ( goal . grade )
1741 } )
1842
1943 it ( "bachelor example 2" , async ( ) => {
2044 const { goal, courses } = BACHELOR . EXAMPLE_2
2145 const delta = membershipService . findBachelorStartYearDelta ( courses )
22- expect ( getYearFromDelta ( delta ) ) . toBe ( goal )
46+
47+ const year = getYearFromDelta ( delta )
48+ const membership = getMockMembershipFromDelta ( "BACHELOR_STUDENT" , delta )
49+
50+ expect ( year ) . toBe ( goal . year )
51+ expect ( getMembershipGrade ( membership ) ) . toBe ( goal . grade )
2352 } )
2453
2554 it ( "bachelor example 3" , async ( ) => {
2655 const { goal, courses } = BACHELOR . EXAMPLE_3
2756 const delta = membershipService . findBachelorStartYearDelta ( courses )
28- expect ( getYearFromDelta ( delta ) ) . toBe ( goal )
57+
58+ const year = getYearFromDelta ( delta )
59+ const membership = getMockMembershipFromDelta ( "BACHELOR_STUDENT" , delta )
60+
61+ expect ( year ) . toBe ( goal . year )
62+ expect ( getMembershipGrade ( membership ) ) . toBe ( goal . grade )
2963 } )
3064
3165 it ( "master example 1" , async ( ) => {
3266 const { goal, courses } = MASTER . EXAMPLE_1
3367 const delta = membershipService . findMasterStartYearDelta ( courses )
34- expect ( getYearFromDelta ( delta ) ) . toBe ( goal )
68+
69+ const year = getYearFromDelta ( delta )
70+ const membership = getMockMembershipFromDelta ( "MASTER_STUDENT" , delta )
71+
72+ expect ( year ) . toBe ( goal . year )
73+ expect ( getMembershipGrade ( membership ) ) . toBe ( goal . grade )
3574 } )
3675
3776 it ( "master example 2" , async ( ) => {
3877 const { goal, courses } = MASTER . EXAMPLE_2
3978 const delta = membershipService . findMasterStartYearDelta ( courses )
40- expect ( getYearFromDelta ( delta ) ) . toBe ( goal )
79+
80+ const year = getYearFromDelta ( delta )
81+ const membership = getMockMembershipFromDelta ( "MASTER_STUDENT" , delta )
82+
83+ expect ( year ) . toBe ( goal . year )
84+ expect ( getMembershipGrade ( membership ) ) . toBe ( goal . grade )
4185 } )
4286} )
4387
4488const MASTER = {
4589 EXAMPLE_1 : {
46- goal : 2024 ,
90+ goal : {
91+ year : 2024 ,
92+ grade : 5 ,
93+ } ,
4794 courses : [
4895 {
4996 code : "IT1901" ,
@@ -218,7 +265,10 @@ const MASTER = {
218265 ] ,
219266 } ,
220267 EXAMPLE_2 : {
221- goal : 2025 ,
268+ goal : {
269+ year : 2025 ,
270+ grade : 4 ,
271+ } ,
222272 courses : [
223273 {
224274 code : "HMS0009" ,
@@ -372,11 +422,14 @@ const MASTER = {
372422 } ,
373423 ] ,
374424 } ,
375- } as const satisfies Record < string , { goal : number ; courses : NTNUGroup [ ] } >
425+ } as const satisfies Record < string , { goal : { year : number ; grade : number } ; courses : NTNUGroup [ ] } >
376426
377427const BACHELOR = {
378428 EXAMPLE_1 : {
379- goal : 2023 ,
429+ goal : {
430+ year : 2023 ,
431+ grade : 3 ,
432+ } ,
380433 courses : [
381434 {
382435 code : "IT1901" ,
@@ -536,7 +589,10 @@ const BACHELOR = {
536589 ] ,
537590 } ,
538591 EXAMPLE_2 : {
539- goal : 2023 ,
592+ goal : {
593+ year : 2023 ,
594+ grade : 3 ,
595+ } ,
540596 courses : [
541597 {
542598 code : "TDT4109" ,
@@ -646,7 +702,10 @@ const BACHELOR = {
646702 ] ,
647703 } ,
648704 EXAMPLE_3 : {
649- goal : 2023 ,
705+ goal : {
706+ year : 2023 ,
707+ grade : 3 ,
708+ } ,
650709 courses : [
651710 {
652711 code : "IT1901" ,
@@ -847,4 +906,4 @@ const BACHELOR = {
847906 } ,
848907 ] ,
849908 } ,
850- } as const satisfies Record < string , { goal : number ; courses : NTNUGroup [ ] } >
909+ } as const satisfies Record < string , { goal : { year : number ; grade : number } ; courses : NTNUGroup [ ] } >
0 commit comments