Skip to content

Commit 722dbd3

Browse files
committed
Make logic in resume-translate-service more robust
1 parent 5e6d0c0 commit 722dbd3

4 files changed

Lines changed: 30 additions & 25 deletions

File tree

src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/resume-translate.service.spec.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { fakeAsync, flush, TestBed, tick } from '@angular/core/testing';
22
import { ActivatedRouteSnapshot, NavigationEnd, Params, Router } from '@angular/router';
33
import { OtJson0Op } from 'ot-json0';
44
import { Json0OpBuilder } from 'realtime-server/lib/esm/common/utils/json0-op-builder';
5-
import { SFProject, SFProjectProfile } from 'realtime-server/lib/esm/scriptureforge/models/sf-project';
5+
import { SFProject } from 'realtime-server/lib/esm/scriptureforge/models/sf-project';
66
import { SFProjectUserConfig } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-user-config';
77
import { Chapter, TextInfo } from 'realtime-server/lib/esm/scriptureforge/models/text-info';
88
import { BehaviorSubject, Observable, of } from 'rxjs';
@@ -17,7 +17,6 @@ import { SFProjectUserConfigDoc } from '../../core/models/sf-project-user-config
1717
import { PermissionsService } from '../../core/permissions.service';
1818
import { SFProjectService } from '../../core/sf-project.service';
1919
import { ResumeTranslateService } from './resume-translate.service';
20-
2120
describe('ResumeTranslateService', () => {
2221
const mockRouter = mock(Router);
2322
const mockUserService = mock(UserService);
@@ -64,19 +63,19 @@ describe('ResumeTranslateService', () => {
6463

6564
service = TestBed.inject(ResumeTranslateService);
6665

67-
when(mockedProjectDoc.data).thenReturn({
68-
texts: [{ bookNum: 40, chapters: [{ number: 1 } as Chapter, { number: 2 } as Chapter] } as TextInfo]
69-
} as SFProject);
66+
const testSFProject = {
67+
texts: [
68+
{ bookNum: 41, chapters: [{ number: 1 } as Chapter, { number: 2 } as Chapter] } as TextInfo,
69+
{ bookNum: 40, chapters: [{ number: 1 } as Chapter, { number: 2 } as Chapter] } as TextInfo
70+
]
71+
} as SFProject;
72+
73+
when(mockedProjectDoc.data).thenReturn(testSFProject);
7074
when(mockProjectService.getUserConfig(anything(), anything())).thenResolve({
7175
changes$: of([]) as Observable<OtJson0Op[]>,
7276
data: { selectedTask: 'checking', selectedBookNum: 40, selectedChapterNum: 2 } as SFProjectUserConfig
7377
} as SFProjectUserConfigDoc);
74-
activatedProjectChange$.next({
75-
data: {
76-
texts: [{ bookNum: 40, chapters: [{ number: 1 } as Chapter, { number: 2 } as Chapter] } as TextInfo]
77-
} as SFProjectProfile
78-
} as SFProjectProfileDoc);
79-
78+
activatedProjectChange$.next({ data: testSFProject } as unknown as SFProjectProfileDoc);
8079
await service['updateProjectUserConfig']('project01');
8180
});
8281

src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/resume-translate.service.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,23 @@ export class ResumeTranslateService extends ResumeBaseService {
4040
filter(([projectDoc, projectUserConfigDoc]) => projectDoc !== undefined && projectUserConfigDoc !== undefined),
4141
map(([projectDoc, projectUserConfigDoc]) => {
4242
const project = projectDoc?.data;
43-
const config = projectUserConfigDoc?.data;
44-
const doesLastBookExist =
45-
projectDoc?.data?.texts.find(t => t.bookNum === config?.selectedBookNum) !== undefined;
43+
const selectedBookNum: number | undefined = projectUserConfigDoc?.data?.selectedBookNum;
44+
const selectedChapterNum: number | undefined = projectUserConfigDoc?.data?.selectedChapterNum;
45+
const doesLastSelectedBookExist =
46+
selectedBookNum != null && project?.texts.find(t => t.bookNum === selectedBookNum) !== undefined;
4647

4748
let bookNum: number;
4849
let chapterNum: number;
49-
if (doesLastBookExist) {
50-
bookNum = config!.selectedBookNum ?? project?.texts[0]?.bookNum ?? Canon.firstBook;
51-
chapterNum = config?.selectedChapterNum ?? project?.texts[bookNum]?.chapters[0].number ?? 1;
50+
if (doesLastSelectedBookExist) {
51+
bookNum = selectedBookNum;
52+
const selectedBookInfo = project?.texts.find(t => t.bookNum === selectedBookNum);
53+
const selectedChapterExists =
54+
selectedChapterNum != null && selectedBookInfo?.chapters.find(c => c.number === selectedChapterNum) != null;
55+
chapterNum = selectedChapterExists ? selectedChapterNum : (selectedBookInfo?.chapters[0]?.number ?? 1);
5256
} else {
53-
bookNum = project?.texts[0]?.bookNum ?? Canon.firstBook;
54-
chapterNum = project?.texts[bookNum]?.chapters[0].number ?? 1;
57+
const bookInfo = project?.texts.slice().sort((a, b) => a.bookNum - b.bookNum)[0];
58+
bookNum = bookInfo?.bookNum ?? Canon.firstBook;
59+
chapterNum = bookInfo?.chapters[0]?.number ?? 1;
5560
}
5661
const bookId = Canon.bookNumberToId(bookNum);
5762

src/SIL.XForge.Scripture/ClientApp/src/app/project/project.component.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,13 +245,13 @@ class TestEnvironment {
245245
args.hasTexts == null || args.hasTexts
246246
? [
247247
{
248-
bookNum: 40,
248+
bookNum: 41,
249249
chapters: [],
250250
hasSource: false,
251251
permissions: {}
252252
},
253253
{
254-
bookNum: 41,
254+
bookNum: 40,
255255
chapters: [],
256256
hasSource: false,
257257
permissions: {}

src/SIL.XForge.Scripture/ClientApp/src/app/project/project.component.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,16 +115,17 @@ export class ProjectComponent extends DataLoadingComponent implements OnInit {
115115
const routePath = ['projects', projectId, task];
116116
let bookNum: number | undefined = projectUserConfig.selectedBookNum;
117117
if (bookNum == null || !project.texts.some(t => t.bookNum === bookNum)) {
118-
bookNum = project.texts[0]?.bookNum;
118+
bookNum = project.texts.slice().sort((a, b) => a.bookNum - b.bookNum)[0]?.bookNum;
119119
}
120120

121121
if (bookNum != null) {
122122
routePath.push(Canon.bookNumberToId(bookNum));
123123

124-
const chapterNum: number | undefined =
125-
projectUserConfig.selectedChapterNum ?? project.texts[bookNum]?.chapters[0]?.number;
124+
const bookInfo = project.texts.find(t => t.bookNum === bookNum);
125+
const chapterNum: number | undefined = projectUserConfig.selectedChapterNum ?? bookInfo?.chapters[0]?.number;
126+
const chapterExists = chapterNum != null && bookInfo?.chapters.some(c => c.number === chapterNum);
126127

127-
if (chapterNum != null) {
128+
if (chapterNum != null && chapterExists) {
128129
routePath.push(chapterNum.toString());
129130
}
130131
}

0 commit comments

Comments
 (0)