@@ -22,6 +22,7 @@ import { SFProjectService } from '../../../../core/sf-project.service';
2222import { BuildDto } from '../../../../machine-api/build-dto' ;
2323import { BuildStates } from '../../../../machine-api/build-states' ;
2424import { DraftGenerationService } from '../../draft-generation.service' ;
25+ import { FORMATTING_OPTIONS_SUPPORTED_DATE } from '../../draft-utils' ;
2526import { TrainingDataService } from '../../training-data/training-data.service' ;
2627import { DraftHistoryEntryComponent } from './draft-history-entry.component' ;
2728
@@ -33,6 +34,10 @@ const mockedTrainingDataService = mock(TrainingDataService);
3334const mockedActivatedProjectService = mock ( ActivatedProjectService ) ;
3435const mockedFeatureFlagsService = mock ( FeatureFlagService ) ;
3536
37+ const oneDay = 1000 * 60 * 60 * 24 ;
38+ const dateBeforeFormattingSupported = new Date ( FORMATTING_OPTIONS_SUPPORTED_DATE . getTime ( ) - oneDay ) . toISOString ( ) ;
39+ const dateAfterFormattingSupported = new Date ( FORMATTING_OPTIONS_SUPPORTED_DATE . getTime ( ) + oneDay ) . toISOString ( ) ;
40+
3641describe ( 'DraftHistoryEntryComponent' , ( ) => {
3742 let component : DraftHistoryEntryComponent ;
3843 let fixture : ComponentFixture < DraftHistoryEntryComponent > ;
@@ -99,7 +104,7 @@ describe('DraftHistoryEntryComponent', () => {
99104 it ( 'should handle builds with additional info' , fakeAsync ( ( ) => {
100105 when ( mockedI18nService . enumerateList ( anything ( ) ) ) . thenReturn ( 'src' ) ;
101106 const user = 'user-display-name' ;
102- const date = 'formatted-date' ;
107+ const date = dateAfterFormattingSupported ;
103108 const trainingBooks = [ 'EXO' ] ;
104109 const translateBooks = [ 'GEN' ] ;
105110 const trainingDataFiles : Map < string , string > = new Map ( [ [ 'file01' , 'training-data.txt' ] ] ) ;
@@ -144,7 +149,7 @@ describe('DraftHistoryEntryComponent', () => {
144149 it ( 'should state that the model did not have training configuration' , fakeAsync ( ( ) => {
145150 when ( mockedI18nService . enumerateList ( anything ( ) ) ) . thenReturn ( 'src' ) ;
146151 const user = 'user-display-name' ;
147- const date = 'formatted-date' ;
152+ const date = dateAfterFormattingSupported ;
148153 const trainingBooks = [ ] ;
149154 const translateBooks = [ 'GEN' ] ;
150155 const trainingDataFiles = [ ] ;
@@ -161,7 +166,7 @@ describe('DraftHistoryEntryComponent', () => {
161166
162167 it ( 'should show the USFM format option when the project is the latest draft' , fakeAsync ( ( ) => {
163168 const user = 'user-display-name' ;
164- const date = 'formatted-date' ;
169+ const date = dateAfterFormattingSupported ;
165170 const trainingBooks = [ 'EXO' ] ;
166171 const translateBooks = [ 'GEN' ] ;
167172 const trainingDataFiles = [ 'file01' ] ;
@@ -244,8 +249,9 @@ describe('DraftHistoryEntryComponent', () => {
244249 when ( mockedActivatedProjectService . changes$ ) . thenReturn ( of ( targetProjectDoc ) ) ;
245250 const entry = {
246251 additionalInfo : {
247- dateGenerated : new Date ( ) . toISOString ( ) ,
248- dateRequested : new Date ( ) . toISOString ( ) ,
252+ dateGenerated : dateAfterFormattingSupported ,
253+ dateRequested : dateAfterFormattingSupported ,
254+ dateFinished : dateAfterFormattingSupported ,
249255 requestedByUserId : 'sf-user-id' ,
250256 translationScriptureRanges : [ { projectId : 'project01' , scriptureRange : 'GEN' } ]
251257 }
@@ -337,14 +343,16 @@ describe('DraftHistoryEntryComponent', () => {
337343 const projectDoc = getProjectProfileDoc ( ) ;
338344 when ( mockedActivatedProjectService . projectDoc ) . thenReturn ( projectDoc ) ;
339345 when ( mockedActivatedProjectService . changes$ ) . thenReturn ( of ( projectDoc ) ) ;
346+ when ( mockedI18nService . formatDate ( anything ( ) ) ) . thenReturn ( 'formatted-date' ) ;
340347 } ) ;
341348
342349 it ( 'should show set draft format UI' , fakeAsync ( ( ) => {
350+ const date = dateAfterFormattingSupported ;
343351 component . entry = {
344352 id : 'build01' ,
345353 state : BuildStates . Completed ,
346354 message : 'Completed' ,
347- additionalInfo : { dateGenerated : '2025-09-01' }
355+ additionalInfo : { dateGenerated : date , dateFinished : date }
348356 } as BuildDto ;
349357 component . isLatestBuild = true ;
350358 component . draftIsAvailable = true ;
@@ -360,7 +368,8 @@ describe('DraftHistoryEntryComponent', () => {
360368 state : BuildStates . Completed ,
361369 message : 'Completed' ,
362370 additionalInfo : {
363- dateGenerated : '2025-09-01' ,
371+ dateGenerated : dateAfterFormattingSupported ,
372+ dateFinished : dateAfterFormattingSupported ,
364373 translationScriptureRanges : [ { projectId : 'source01' , scriptureRange : 'EXO' } ]
365374 }
366375 } as BuildDto ;
@@ -377,7 +386,8 @@ describe('DraftHistoryEntryComponent', () => {
377386 state : BuildStates . Completed ,
378387 message : 'Completed' ,
379388 additionalInfo : {
380- dateGenerated : '2025-09-01' ,
389+ dateGenerated : dateAfterFormattingSupported ,
390+ dateFinished : dateAfterFormattingSupported ,
381391 translationScriptureRanges : [ { projectId : 'source01' , scriptureRange : 'EXO' } ]
382392 }
383393 } as BuildDto ;
@@ -389,13 +399,38 @@ describe('DraftHistoryEntryComponent', () => {
389399 } ) ) ;
390400
391401 it ( 'should hide draft format UI if the draft is not completed' , fakeAsync ( ( ) => {
392- component . entry = { id : 'build01' , state : BuildStates . Canceled , message : 'Cancelled' } as BuildDto ;
402+ component . entry = {
403+ id : 'build01' ,
404+ state : BuildStates . Canceled ,
405+ message : 'Cancelled' ,
406+ additionalInfo : { dateGenerated : dateAfterFormattingSupported , dateFinished : dateAfterFormattingSupported }
407+ } as BuildDto ;
393408 component . isLatestBuild = true ;
394409 component . draftIsAvailable = false ;
395410 tick ( ) ;
396411 fixture . detectChanges ( ) ;
397412 expect ( fixture . nativeElement . querySelector ( '.require-formatting-options' ) ) . toBeNull ( ) ;
398413 } ) ) ;
414+
415+ it ( 'should not show the USFM format option for drafts created before the supported date' , fakeAsync ( ( ) => {
416+ const user = 'user-display-name' ;
417+ const date = dateBeforeFormattingSupported ;
418+ const trainingBooks = [ 'EXO' ] ;
419+ const translateBooks = [ 'GEN' ] ;
420+ const trainingDataFiles = [ 'file01' ] ;
421+ const entry = getStandardBuildDto ( { user, date, trainingBooks, translateBooks, trainingDataFiles } ) ;
422+
423+ // SUT
424+ component . entry = entry ;
425+ component . isLatestBuild = true ;
426+ tick ( ) ;
427+ fixture . detectChanges ( ) ;
428+
429+ expect ( component . scriptureRange ) . toEqual ( 'GEN' ) ;
430+ expect ( component . draftIsAvailable ) . toBe ( true ) ;
431+ expect ( fixture . nativeElement . querySelector ( '.format-usfm' ) ) . toBeNull ( ) ;
432+ expect ( component . formattingOptionsSupported ) . toBe ( false ) ;
433+ } ) ) ;
399434 } ) ;
400435
401436 describe ( 'formatDate' , ( ) => {
@@ -457,8 +492,9 @@ describe('DraftHistoryEntryComponent', () => {
457492 id : 'project01'
458493 } ,
459494 additionalInfo : {
460- dateGenerated : new Date ( ) . toISOString ( ) ,
461- dateRequested : new Date ( ) . toISOString ( ) ,
495+ dateGenerated : new Date ( date ) . toISOString ( ) ,
496+ dateFinished : new Date ( date ) . toISOString ( ) ,
497+ dateRequested : new Date ( date ) . toISOString ( ) ,
462498 requestedByUserId : 'sf-user-id' ,
463499 trainingScriptureRanges :
464500 trainingBooks . length > 0 ? [ { projectId : 'project02' , scriptureRange : trainingBooks . join ( ';' ) } ] : [ ] ,
0 commit comments