Skip to content

Commit d6d48fc

Browse files
committed
SF-3655 Do not update the draft in Mongo when another draft has started
1 parent 0c0ac28 commit d6d48fc

File tree

2 files changed

+93
-11
lines changed

2 files changed

+93
-11
lines changed

src/SIL.XForge.Scripture/Services/MachineApiService.cs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,24 +1063,37 @@ CancellationToken cancellationToken
10631063

10641064
try
10651065
{
1066-
// Get the last completed build
1067-
TranslationBuild? translationBuild = (
1068-
await translationEnginesClient.GetAllBuildsAsync(translationEngineId, cancellationToken)
1069-
)
1066+
// Get the last build and the last completed build
1067+
IList<TranslationBuild> translationBuilds = await translationEnginesClient.GetAllBuildsAsync(
1068+
translationEngineId,
1069+
cancellationToken
1070+
);
1071+
TranslationBuild? lastTranslationBuild = translationBuilds.LastOrDefault();
1072+
TranslationBuild? lastCompletedTranslationBuild = translationBuilds
10701073
.Where(b => b.State == JobState.Completed)
10711074
.MaxBy(b => b.DateFinished);
1072-
if (translationBuild is not null)
1075+
1076+
// See if the very last build has completed
1077+
if (lastTranslationBuild?.State == JobState.Completed)
10731078
{
10741079
// See if the current scripture range has changed
1075-
string currentScriptureRange = GetDraftedScriptureRange(translationBuild);
1076-
if (project.TranslateConfig.DraftConfig.CurrentScriptureRange != currentScriptureRange)
1080+
string currentScriptureRange = GetDraftedScriptureRange(lastTranslationBuild);
1081+
if (
1082+
!string.IsNullOrWhiteSpace(currentScriptureRange)
1083+
&& project.TranslateConfig.DraftConfig.CurrentScriptureRange != currentScriptureRange
1084+
)
10771085
{
10781086
backgroundJobClient.Enqueue<IMachineApiService>(r =>
10791087
r.RetrievePreTranslationStatusAsync(sfProjectId, CancellationToken.None)
10801088
);
10811089
}
10821090

1083-
buildDto = CreateDto(translationBuild);
1091+
buildDto = CreateDto(lastTranslationBuild);
1092+
}
1093+
else if (lastCompletedTranslationBuild is not null)
1094+
{
1095+
// The very last build is active, so return the last completed build
1096+
buildDto = CreateDto(lastCompletedTranslationBuild);
10841097
}
10851098
}
10861099
catch (ServalApiException e)

test/SIL.XForge.Scripture.Tests/Services/MachineApiServiceTests.cs

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1938,7 +1938,7 @@ public async Task GetLastCompletedPreTranslationBuildAsync_RetrievePreTranslatio
19381938
}
19391939

19401940
[Test]
1941-
public async Task GetLastCompletedPreTranslationBuildAsync_NoRetrievePreTranslationStatusAsyncCall_Success()
1941+
public async Task GetLastCompletedPreTranslationBuildAsync_NoRetrievePreTranslationStatusAsyncCallWhenActiveBuild_Success()
19421942
{
19431943
// Set up test environment
19441944
var env = new TestEnvironment();
@@ -1974,6 +1974,73 @@ public async Task GetLastCompletedPreTranslationBuildAsync_NoRetrievePreTranslat
19741974
},
19751975
],
19761976
},
1977+
new TranslationBuild
1978+
{
1979+
Url = "https://example.com",
1980+
Id = Build02,
1981+
Engine = new ResourceLink { Id = "engineId", Url = "https://example.com" },
1982+
State = JobState.Active,
1983+
},
1984+
]
1985+
)
1986+
);
1987+
1988+
// SUT
1989+
ServalBuildDto? actual = await env.Service.GetLastCompletedPreTranslationBuildAsync(
1990+
User01,
1991+
Project01,
1992+
false,
1993+
CancellationToken.None
1994+
);
1995+
1996+
// RetrievePreTranslationStatusAsync is run via a background job, so we verify that no new job was scheduled
1997+
env.BackgroundJobClient.DidNotReceive().Create(Arg.Any<Job>(), Arg.Any<IState>());
1998+
1999+
TestEnvironment.AssertCoreBuildProperties(CompletedTranslationBuild, actual);
2000+
}
2001+
2002+
[Test]
2003+
public async Task GetLastCompletedPreTranslationBuildAsync_NoRetrievePreTranslationStatusAsyncCallWhenAlreadyRun_Success()
2004+
{
2005+
// Set up test environment
2006+
var env = new TestEnvironment();
2007+
const string scriptureRange = "GEN";
2008+
await env.Projects.UpdateAsync(
2009+
Project01,
2010+
u => u.Set(p => p.TranslateConfig.DraftConfig.CurrentScriptureRange, scriptureRange)
2011+
);
2012+
const double percentCompleted = 0;
2013+
const int revision = 43;
2014+
const JobState state = JobState.Completed;
2015+
env.TranslationEnginesClient.GetAllBuildsAsync(TranslationEngine01, CancellationToken.None)
2016+
.Returns(
2017+
Task.FromResult<IList<TranslationBuild>>(
2018+
[
2019+
new TranslationBuild
2020+
{
2021+
Url = "https://example.com",
2022+
Id = Build01,
2023+
Engine = new ResourceLink { Id = "engineId", Url = "https://example.com" },
2024+
Message = MachineApiService.BuildStateCompleted,
2025+
Progress = percentCompleted,
2026+
Revision = revision,
2027+
State = state,
2028+
DateFinished = DateTimeOffset.UtcNow,
2029+
Pretranslate =
2030+
[
2031+
new PretranslateCorpus
2032+
{
2033+
SourceFilters =
2034+
[
2035+
new ParallelCorpusFilter
2036+
{
2037+
Corpus = new ResourceLink { Id = "corpusId", Url = "https://example.com" },
2038+
ScriptureRange = scriptureRange,
2039+
},
2040+
],
2041+
},
2042+
],
2043+
},
19772044
]
19782045
)
19792046
);
@@ -1986,7 +2053,8 @@ public async Task GetLastCompletedPreTranslationBuildAsync_NoRetrievePreTranslat
19862053
CancellationToken.None
19872054
);
19882055

1989-
await env.Service.DidNotReceive().RetrievePreTranslationStatusAsync(Project01, CancellationToken.None);
2056+
// RetrievePreTranslationStatusAsync is run via a background job, so we verify that no new job was scheduled
2057+
env.BackgroundJobClient.DidNotReceive().Create(Arg.Any<Job>(), Arg.Any<IState>());
19902058

19912059
TestEnvironment.AssertCoreBuildProperties(CompletedTranslationBuild, actual);
19922060
}
@@ -2040,7 +2108,8 @@ public async Task GetLastCompletedPreTranslationBuildAsync_NullScriptureRange_Su
20402108
CancellationToken.None
20412109
);
20422110

2043-
await env.Service.DidNotReceive().RetrievePreTranslationStatusAsync(Project01, CancellationToken.None);
2111+
// RetrievePreTranslationStatusAsync is run via a background job, so we verify that no new job was scheduled
2112+
env.BackgroundJobClient.DidNotReceive().Create(Arg.Any<Job>(), Arg.Any<IState>());
20442113

20452114
TestEnvironment.AssertCoreBuildProperties(CompletedTranslationBuild, actual);
20462115
}

0 commit comments

Comments
 (0)