@@ -28,6 +28,27 @@ import {
2828 MIN_MAX_SUBMISSIONS ,
2929 MAX_MAX_SUBMISSIONS ,
3030} from "./form-validation" ;
31+ import {
32+ INVALID_EMAIL_NO_AT ,
33+ INVALID_TASK_BAD_POSTER ,
34+ INVALID_TASK_BAD_TOKEN ,
35+ INVALID_TASK_EMPTY_DESCRIPTION ,
36+ INVALID_TASK_EMPTY_TITLE ,
37+ INVALID_TASK_PAST_DEADLINE ,
38+ INVALID_TASK_ZERO_REWARD ,
39+ INVALID_TASK_ZERO_SUBMISSIONS ,
40+ INVALID_WORK_SUBMISSION_BAD_CONTRIBUTOR ,
41+ INVALID_WORK_SUBMISSION_EMPTY_DESCRIPTION ,
42+ INVALID_WORK_SUBMISSION_EMPTY_URL ,
43+ INVALID_WORK_SUBMISSION_INVALID_URL ,
44+ STANDARD_STELLAR_ADDRESS ,
45+ VALID_EMAIL ,
46+ VALID_TASK_DATA ,
47+ VALID_TASK_DATA_WITH_OPTIONALS ,
48+ VALID_WORK_SUBMISSION ,
49+ VALID_WORK_SUBMISSION_WITH_CONTRIBUTOR ,
50+ } from "@/test/mock-data" ;
51+ import { futureDeadline , pastDeadline } from "@/test/fixtures" ;
3152
3253// ============================================================================
3354// validateRequired
@@ -688,14 +709,7 @@ describe("validateSubmissionDescription", () => {
688709// ============================================================================
689710
690711describe ( "validateCreateTaskForm" , ( ) => {
691- const validForm = {
692- title : "Build a DEX Interface" ,
693- description :
694- "Create a React frontend for Stellar DEX with swap UI, wallet integration, and transaction history." ,
695- reward : "100" ,
696- deadline : String ( Math . floor ( Date . now ( ) / 1000 ) + 30 * 24 * 60 * 60 ) , // 30 days
697- maxSubmissions : "3" ,
698- } ;
712+ const validForm = VALID_TASK_DATA ;
699713
700714 it ( "accepts a completely valid form" , ( ) => {
701715 const result = validateCreateTaskForm ( validForm ) ;
@@ -704,7 +718,7 @@ describe("validateCreateTaskForm", () => {
704718 } ) ;
705719
706720 it ( "rejects empty title" , ( ) => {
707- const result = validateCreateTaskForm ( { ... validForm , title : "" } ) ;
721+ const result = validateCreateTaskForm ( INVALID_TASK_EMPTY_TITLE ) ;
708722 expect ( result . ok ) . toBe ( false ) ;
709723 expect ( result . errors . title ) . toBeDefined ( ) ;
710724 } ) ;
@@ -716,40 +730,40 @@ describe("validateCreateTaskForm", () => {
716730 } ) ;
717731
718732 it ( "rejects empty description" , ( ) => {
719- const result = validateCreateTaskForm ( { ... validForm , description : "" } ) ;
733+ const result = validateCreateTaskForm ( INVALID_TASK_EMPTY_DESCRIPTION ) ;
720734 expect ( result . ok ) . toBe ( false ) ;
721735 expect ( result . errors . description ) . toBeDefined ( ) ;
722736 } ) ;
723737
724738 it ( "rejects invalid reward" , ( ) => {
725- const result = validateCreateTaskForm ( { ... validForm , reward : "0" } ) ;
739+ const result = validateCreateTaskForm ( INVALID_TASK_ZERO_REWARD ) ;
726740 expect ( result . ok ) . toBe ( false ) ;
727741 expect ( result . errors . reward ) . toBeDefined ( ) ;
728742 } ) ;
729743
730744 it ( "rejects past deadline" , ( ) => {
731- const past = String ( Math . floor ( Date . now ( ) / 1000 ) - 3600 ) ;
732- const result = validateCreateTaskForm ( { ...validForm , deadline : past } ) ;
745+ const result = validateCreateTaskForm ( {
746+ ...validForm ,
747+ deadline : String ( pastDeadline ( ) ) ,
748+ } ) ;
733749 expect ( result . ok ) . toBe ( false ) ;
734750 expect ( result . errors . deadline ) . toBeDefined ( ) ;
735751 } ) ;
736752
737753 it ( "rejects invalid max submissions" , ( ) => {
738- const result = validateCreateTaskForm ( { ... validForm , maxSubmissions : "0" } ) ;
754+ const result = validateCreateTaskForm ( INVALID_TASK_ZERO_SUBMISSIONS ) ;
739755 expect ( result . ok ) . toBe ( false ) ;
740756 expect ( result . errors . maxSubmissions ) . toBeDefined ( ) ;
741757 } ) ;
742758
743759 it ( "validates token address if provided" , ( ) => {
744- const result = validateCreateTaskForm ( {
745- ...validForm ,
746- token : "invalid-token" ,
747- } ) ;
760+ const result = validateCreateTaskForm ( INVALID_TASK_BAD_TOKEN ) ;
748761 expect ( result . ok ) . toBe ( false ) ;
749762 expect ( result . errors . token ) . toBeDefined ( ) ;
750763 } ) ;
751764
752765 it ( "accepts valid token address" , ( ) => {
766+ const result = validateCreateTaskForm ( VALID_TASK_DATA_WITH_OPTIONALS ) ;
753767 const result = validateCreateTaskForm ( {
754768 ...validForm ,
755769 token : "GABCDEFGHIJKLMNOPQRSTUVWXYZ234567ABCDEFGHIJKLMNOPQRSTUVW" ,
@@ -763,10 +777,7 @@ describe("validateCreateTaskForm", () => {
763777 } ) ;
764778
765779 it ( "validates poster address if provided" , ( ) => {
766- const result = validateCreateTaskForm ( {
767- ...validForm ,
768- posterAddress : "bad-address" ,
769- } ) ;
780+ const result = validateCreateTaskForm ( INVALID_TASK_BAD_POSTER ) ;
770781 expect ( result . ok ) . toBe ( false ) ;
771782 expect ( result . errors . posterAddress ) . toBeDefined ( ) ;
772783 } ) ;
@@ -793,46 +804,33 @@ describe("validateCreateTaskForm", () => {
793804// ============================================================================
794805
795806describe ( "validateWorkSubmissionForm" , ( ) => {
796- const validForm = {
797- workUrl : "https://github.com/user/task-submission" ,
798- description :
799- "Implemented all required features for the DEX interface including swap, liquidity pools, and wallet integration." ,
800- } ;
807+ const validForm = VALID_WORK_SUBMISSION ;
801808
802809 it ( "accepts a completely valid submission form" , ( ) => {
803810 const result = validateWorkSubmissionForm ( validForm ) ;
804811 expect ( result . ok ) . toBe ( true ) ;
805812 } ) ;
806813
807814 it ( "rejects empty work URL" , ( ) => {
808- const result = validateWorkSubmissionForm ( { ... validForm , workUrl : "" } ) ;
815+ const result = validateWorkSubmissionForm ( INVALID_WORK_SUBMISSION_EMPTY_URL ) ;
809816 expect ( result . ok ) . toBe ( false ) ;
810817 expect ( result . errors . workUrl ) . toBeDefined ( ) ;
811818 } ) ;
812819
813820 it ( "rejects invalid work URL" , ( ) => {
814- const result = validateWorkSubmissionForm ( {
815- ...validForm ,
816- workUrl : "not-a-url" ,
817- } ) ;
821+ const result = validateWorkSubmissionForm ( INVALID_WORK_SUBMISSION_INVALID_URL ) ;
818822 expect ( result . ok ) . toBe ( false ) ;
819823 expect ( result . errors . workUrl ) . toBeDefined ( ) ;
820824 } ) ;
821825
822826 it ( "rejects empty description" , ( ) => {
823- const result = validateWorkSubmissionForm ( {
824- ...validForm ,
825- description : "" ,
826- } ) ;
827+ const result = validateWorkSubmissionForm ( INVALID_WORK_SUBMISSION_EMPTY_DESCRIPTION ) ;
827828 expect ( result . ok ) . toBe ( false ) ;
828829 expect ( result . errors . description ) . toBeDefined ( ) ;
829830 } ) ;
830831
831832 it ( "validates contributor address if provided" , ( ) => {
832- const result = validateWorkSubmissionForm ( {
833- ...validForm ,
834- contributorAddress : "bad" ,
835- } ) ;
833+ const result = validateWorkSubmissionForm ( INVALID_WORK_SUBMISSION_BAD_CONTRIBUTOR ) ;
836834 expect ( result . ok ) . toBe ( false ) ;
837835 expect ( result . errors . contributorAddress ) . toBeDefined ( ) ;
838836 } ) ;
@@ -846,6 +844,7 @@ describe("validateWorkSubmissionForm", () => {
846844 } ) ;
847845
848846 it ( "accepts valid contributor address" , ( ) => {
847+ const result = validateWorkSubmissionForm ( VALID_WORK_SUBMISSION_WITH_CONTRIBUTOR ) ;
849848 const result = validateWorkSubmissionForm ( {
850849 ...validForm ,
851850 contributorAddress : "GABCDEFGHIJKLMNOPQRSTUVWXYZ234567ABCDEFGHIJKLMNOPQRSTUVW" ,
@@ -866,13 +865,13 @@ describe("validateWaitlistForm", () => {
866865 } ) ;
867866
868867 it ( "rejects invalid email" , ( ) => {
869- const result = validateWaitlistForm ( "not-email" ) ;
868+ const result = validateWaitlistForm ( INVALID_EMAIL_NO_AT ) ;
870869 expect ( result . ok ) . toBe ( false ) ;
871870 expect ( result . error ) . toBe ( "Please enter a valid email address." ) ;
872871 } ) ;
873872
874873 it ( "accepts valid email" , ( ) => {
875- const result = validateWaitlistForm ( "user@example.com" ) ;
874+ const result = validateWaitlistForm ( VALID_EMAIL ) ;
876875 expect ( result . ok ) . toBe ( true ) ;
877876 } ) ;
878877} ) ;
0 commit comments