@@ -13,7 +13,7 @@ import { Success } from '../../../../../src/quest/domain/models/Success.js';
13
13
import { KnowledgeElement } from '../../../../../src/shared/domain/models/index.js' ;
14
14
import { expect } from '../../../../test-helper.js' ;
15
15
16
- describe ( 'Quest | Unit | Domain | Models | Requirement ' , function ( ) {
16
+ describe . only ( 'Quest | Unit | Domain | Models | Requirement ' , function ( ) {
17
17
describe ( 'Factory - buildRequirement' , function ( ) {
18
18
context ( 'when requirement_type is compose' , function ( ) {
19
19
it ( 'should build a ComposedRequirement' , function ( ) {
@@ -664,18 +664,46 @@ describe('Quest | Unit | Domain | Models | Requirement ', function () {
664
664
beforeEach ( function ( ) {
665
665
successWith60MasteryPercentage = new Success ( {
666
666
knowledgeElements : [
667
- { status : KnowledgeElement . StatusType . VALIDATED , skillId : 'skill1tubeA' } ,
668
- { status : KnowledgeElement . StatusType . INVALIDATED , skillId : 'skill2tubeA' } ,
669
- { status : KnowledgeElement . StatusType . VALIDATED , skillId : 'skill3tubeA' } ,
670
- { status : KnowledgeElement . StatusType . VALIDATED , skillId : 'skill4tubeA' } ,
671
- { status : KnowledgeElement . StatusType . VALIDATED , skillId : 'skill1tubeB' } ,
672
- { status : KnowledgeElement . StatusType . VALIDATED , skillId : 'skill2tubeB' } ,
673
- { status : KnowledgeElement . StatusType . INVALIDATED , skillId : 'skill3tubeB' } ,
674
- { status : KnowledgeElement . StatusType . VALIDATED , skillId : 'skillTubeC' } ,
675
- { status : KnowledgeElement . StatusType . VALIDATED , skillId : 'skillTubeD' } ,
667
+ {
668
+ status : KnowledgeElement . StatusType . VALIDATED ,
669
+ skillId : 'skill1tubeA_V1' ,
670
+ createdAt : new Date ( '2025-03-17' ) ,
671
+ } ,
672
+ {
673
+ status : KnowledgeElement . StatusType . INVALIDATED ,
674
+ skillId : 'skill2tubeA' ,
675
+ createdAt : new Date ( '2025-03-17' ) ,
676
+ } ,
677
+ {
678
+ status : KnowledgeElement . StatusType . VALIDATED ,
679
+ skillId : 'skill3tubeA' ,
680
+ createdAt : new Date ( '2025-03-17' ) ,
681
+ } ,
682
+ {
683
+ status : KnowledgeElement . StatusType . VALIDATED ,
684
+ skillId : 'skill4tubeA' ,
685
+ createdAt : new Date ( '2025-03-17' ) ,
686
+ } ,
687
+ {
688
+ status : KnowledgeElement . StatusType . VALIDATED ,
689
+ skillId : 'skill1tubeB' ,
690
+ createdAt : new Date ( '2025-03-17' ) ,
691
+ } ,
692
+ {
693
+ status : KnowledgeElement . StatusType . VALIDATED ,
694
+ skillId : 'skill2tubeB' ,
695
+ createdAt : new Date ( '2025-03-17' ) ,
696
+ } ,
697
+ {
698
+ status : KnowledgeElement . StatusType . INVALIDATED ,
699
+ skillId : 'skill3tubeB' ,
700
+ createdAt : new Date ( '2025-03-17' ) ,
701
+ } ,
702
+ { status : KnowledgeElement . StatusType . VALIDATED , skillId : 'skillTubeC' , createdAt : new Date ( '2025-03-17' ) } ,
703
+ { status : KnowledgeElement . StatusType . VALIDATED , skillId : 'skillTubeD' , createdAt : new Date ( '2025-03-17' ) } ,
676
704
] ,
677
- skills : [
678
- { id : 'skill1tubeA ' , tubeId : 'tubeA' , difficulty : 1 } ,
705
+ campaignSkills : [
706
+ { id : 'skill1tubeA_V1 ' , tubeId : 'tubeA' , difficulty : 1 } ,
679
707
{ id : 'skill2tubeA' , tubeId : 'tubeA' , difficulty : 2 } ,
680
708
{ id : 'skill3tubeA' , tubeId : 'tubeA' , difficulty : 3 } ,
681
709
{ id : 'skill4tubeA' , tubeId : 'tubeA' , difficulty : 4 } ,
@@ -687,6 +715,71 @@ describe('Quest | Unit | Domain | Models | Requirement ', function () {
687
715
] ,
688
716
} ) ;
689
717
} ) ;
718
+ context (
719
+ 'when two skills exist for a tube and a difficulty compute fulfillement taking in account only most recent knowledge element' ,
720
+ function ( ) {
721
+ it ( 'return true' , function ( ) {
722
+ // given
723
+ const success = new Success ( {
724
+ knowledgeElements : [
725
+ ...successWith60MasteryPercentage . knowledgeElements ,
726
+ {
727
+ status : KnowledgeElement . StatusType . INVALIDATED ,
728
+ skillId : 'skill1tubeA_V2' ,
729
+ createdAt : new Date ( '2024-06-10' ) ,
730
+ } ,
731
+ ] ,
732
+ campaignSkills : [
733
+ ...successWith60MasteryPercentage . campaignSkills ,
734
+ { id : 'skill1tubeA_V2' , tubeId : 'tubeA' , difficulty : 1 } ,
735
+ ] ,
736
+ } ) ;
737
+ const requirement = new CappedTubesProfileRequirement ( {
738
+ data : {
739
+ cappedTubes,
740
+ threshold : 60 ,
741
+ } ,
742
+ } ) ;
743
+
744
+ // when
745
+ const isFulfilled = requirement . isFulfilled ( success ) ;
746
+
747
+ // then
748
+ expect ( isFulfilled ) . to . be . true ;
749
+ } ) ;
750
+
751
+ it ( 'return false' , function ( ) {
752
+ // given
753
+ const success = new Success ( {
754
+ knowledgeElements : [
755
+ ...successWith60MasteryPercentage . knowledgeElements ,
756
+ {
757
+ status : KnowledgeElement . StatusType . INVALIDATED ,
758
+ skillId : 'skill1tubeA_V2' ,
759
+ createdAt : new Date ( '2025-12-24' ) ,
760
+ } ,
761
+ ] ,
762
+ campaignSkills : [
763
+ ...successWith60MasteryPercentage . campaignSkills ,
764
+ { id : 'skill1tubeA_V2' , tubeId : 'tubeA' , difficulty : 1 } ,
765
+ ] ,
766
+ } ) ;
767
+ const requirement = new CappedTubesProfileRequirement ( {
768
+ data : {
769
+ cappedTubes,
770
+ threshold : 60 ,
771
+ } ,
772
+ } ) ;
773
+
774
+ // when
775
+ const isFulfilled = requirement . isFulfilled ( success ) ;
776
+
777
+ // then
778
+ expect ( isFulfilled ) . to . be . false ;
779
+ } ) ;
780
+ } ,
781
+ ) ;
782
+
690
783
context ( "when dataInput's masteryPercentage is below threshold" , function ( ) {
691
784
it ( 'should return false' , function ( ) {
692
785
// given
@@ -711,7 +804,7 @@ describe('Quest | Unit | Domain | Models | Requirement ', function () {
711
804
const requirement = new CappedTubesProfileRequirement ( {
712
805
data : {
713
806
cappedTubes,
714
- threshold : 50 ,
807
+ threshold : 60 ,
715
808
} ,
716
809
} ) ;
717
810
0 commit comments