Skip to content

Add cleanup service tests for word alignment #1400

Add cleanup service tests for word alignment

Add cleanup service tests for word alignment #1400

GitHub Actions / NUnit Tests failed Dec 18, 2024 in 0s

451 passed, 1 failed and 0 skipped

Tests failed

Report Passed Failed Skipped Time
src/DataAccess/test/SIL.DataAccess.Tests/TestResults/test-results.trx 25✅ 3s
src/Machine/test/Serval.Machine.Shared.Tests/TestResults/test-results.trx 102✅ 31s
src/Serval/test/Serval.ApiServer.IntegrationTests/TestResults/test-results.trx 227✅ 1❌ 766s
src/Serval/test/Serval.DataFiles.Tests/TestResults/test-results.trx 11✅ 11s
src/Serval/test/Serval.E2ETests/TestResults/test-results.trx 771ms
src/Serval/test/Serval.Shared.Tests/TestResults/test-results.trx 3✅ 6s
src/Serval/test/Serval.Translation.Tests/TestResults/test-results.trx 50✅ 10s
src/Serval/test/Serval.Webhooks.Tests/TestResults/test-results.trx 5✅ 7s
src/Serval/test/Serval.WordAlignment.Tests/TestResults/test-results.trx 27✅ 7s
src/ServiceToolkit/test/SIL.ServiceToolkit.Tests/TestResults/test-results.trx 1✅ 5s

✅ src/DataAccess/test/SIL.DataAccess.Tests/TestResults/test-results.trx

25 tests were completed in 3s with 25 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
SIL.DataAccess.MemoryRepositoryTests 25✅ 227ms

✅ SIL.DataAccess.MemoryRepositoryTests

✅ DeleteAsync_DoesNotExist
✅ DeleteAsync_Exists
✅ GetAsync_DoesNotExist
✅ GetAsync_Exists
✅ InsertAsync_DoesNotExist
✅ InsertAsync_Exists
✅ InsertAsync_ReadOnlyCollectionExpression
✅ UpdateAsync_Add_Array
✅ UpdateAsync_Add_List
✅ UpdateAsync_Add_ReadOnlyCollection
✅ UpdateAsync_Add_ReadOnlyList
✅ UpdateAsync_DoesNotExist
✅ UpdateAsync_Remove_Array
✅ UpdateAsync_Remove_List
✅ UpdateAsync_Remove_ReadOnlyCollection
✅ UpdateAsync_Remove_ReadOnlyList
✅ UpdateAsync_RemoveAll_Array
✅ UpdateAsync_RemoveAll_List
✅ UpdateAsync_RemoveAll_ReadOnlyCollection
✅ UpdateAsync_RemoveAll_ReadOnlyList
✅ UpdateAsync_Set
✅ UpdateAsync_SetAll
✅ UpdateAsync_SetOnInsert
✅ UpdateAsync_Unset
✅ UpdateAsync_Upsert

✅ src/Machine/test/Serval.Machine.Shared.Tests/TestResults/test-results.trx

102 tests were completed in 31s with 102 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Serval.Machine.Shared.Services.ClearMLServiceTests 1✅ 167ms
Serval.Machine.Shared.Services.DistributedReaderWriterLockFactoryTests 3✅ 92ms
Serval.Machine.Shared.Services.DistributedReaderWriterLockTests 15✅ 1s
Serval.Machine.Shared.Services.InMemoryStorageTests 5✅ 13ms
Serval.Machine.Shared.Services.LanguageTagServiceTests 19✅ 7s
Serval.Machine.Shared.Services.LocalStorageTests 5✅ 11ms
Serval.Machine.Shared.Services.MessageOutboxDeliveryServiceTests 4✅ 88ms
Serval.Machine.Shared.Services.MessageOutboxServiceTests 4✅ 14ms
Serval.Machine.Shared.Services.ModelCleanupServiceTests 1✅ 16ms
Serval.Machine.Shared.Services.NmtClearMLBuildJobFactoryTests 2✅ 15ms
Serval.Machine.Shared.Services.NmtEngineServiceTests 4✅ 2s
Serval.Machine.Shared.Services.PreprocessBuildJobTests 22✅ 9s
Serval.Machine.Shared.Services.ServalPlatformOutboxMessageHandlerTests 2✅ 46ms
Serval.Machine.Shared.Services.SmtTransferEngineServiceTests 15✅ 2s

✅ Serval.Machine.Shared.Services.ClearMLServiceTests

✅ CreateTaskAsync

✅ Serval.Machine.Shared.Services.DistributedReaderWriterLockFactoryTests

✅ InitAsync_ReleaseReaderLocks
✅ InitAsync_ReleaseWriterLocks
✅ InitAsync_RemoveWaiters

✅ Serval.Machine.Shared.Services.DistributedReaderWriterLockTests

✅ ReaderLockAsync_Cancelled
✅ ReaderLockAsync_NoLockAcquired
✅ ReaderLockAsync_ReaderLockAcquired
✅ ReaderLockAsync_WriterLockAcquiredAndExpired
✅ ReaderLockAsync_WriterLockAcquiredAndNotReleased
✅ ReaderLockAsync_WriterLockAcquiredAndReleased
✅ WriterLockAsync_Cancelled
✅ WriterLockAsync_FirstWriterLockHasPriority
✅ WriterLockAsync_NoLockAcquired
✅ WriterLockAsync_ReaderLockAcquiredAndNotReleased
✅ WriterLockAsync_ReaderLockAcquiredAndReleased
✅ WriterLockAsync_WriterLockAcquiredAndExpired
✅ WriterLockAsync_WriterLockAcquiredAndNeverReleased
✅ WriterLockAsync_WriterLockAcquiredAndReleased
✅ WriterLockAsync_WriterLockTakesPriorityOverReaderLock

✅ Serval.Machine.Shared.Services.InMemoryStorageTests

✅ DeleteAsync
✅ ExistsAsync
✅ ListFilesAsync_DoNotRecurse
✅ ListFilesAsync_Recurse
✅ OpenReadAsync

✅ Serval.Machine.Shared.Services.LanguageTagServiceTests

✅ ConvertToFlores200CodeTest("arb","arb_Arab")
✅ ConvertToFlores200CodeTest("cmn-Hant","zho_Hant")
✅ ConvertToFlores200CodeTest("cmn","zho_Hans")
✅ ConvertToFlores200CodeTest("eng-Latn","eng_Latn")
✅ ConvertToFlores200CodeTest("eng","eng_Latn")
✅ ConvertToFlores200CodeTest("es","spa_Latn")
✅ ConvertToFlores200CodeTest("hne","hne_Deva")
✅ ConvertToFlores200CodeTest("kor_Kore","kor_Hang")
✅ ConvertToFlores200CodeTest("kor","kor_Hang")
✅ ConvertToFlores200CodeTest("ks-Arab","kas_Arab")
✅ ConvertToFlores200CodeTest("ms","zsm_Latn")
✅ ConvertToFlores200CodeTest("srp_Cyrl","srp_Cyrl")
✅ ConvertToFlores200CodeTest("zh-Hant","zho_Hant")
✅ ConvertToFlores200CodeTest("zh-TW","zho_Hant")
✅ ConvertToFlores200CodeTest("zh","zho_Hans")
✅ GetLanguageInfoAsync("cmn","zho_Hans",True)
✅ GetLanguageInfoAsync("en","eng_Latn",True)
✅ GetLanguageInfoAsync("ms","zsm_Latn",True)
✅ GetLanguageInfoAsync("xyz","xyz",False)

✅ Serval.Machine.Shared.Services.LocalStorageTests

✅ DeleteFileAsync
✅ ExistsAsync
✅ ListFilesAsync_DoNotRecurse
✅ ListFilesAsync_Recurse
✅ OpenReadAsync

✅ Serval.Machine.Shared.Services.MessageOutboxDeliveryServiceTests

✅ ProcessMessagesAsync
✅ ProcessMessagesAsync_File
✅ ProcessMessagesAsync_Timeout
✅ ProcessMessagesAsync_UnavailableFailure

✅ Serval.Machine.Shared.Services.MessageOutboxServiceTests

✅ EnqueueMessageAsync_ContentTooLarge
✅ EnqueueMessageAsync_ExistingOutbox
✅ EnqueueMessageAsync_HasContentStream
✅ EnqueueMessageAsync_NoContentStream

✅ Serval.Machine.Shared.Services.ModelCleanupServiceTests

✅ CheckModelsAsync_ValidFiles

✅ Serval.Machine.Shared.Services.NmtClearMLBuildJobFactoryTests

✅ CreateJobScriptAsync_BuildOptions
✅ CreateJobScriptAsync_NoBuildOptions

✅ Serval.Machine.Shared.Services.NmtEngineServiceTests

✅ CancelBuildAsync_Building
✅ CancelBuildAsync_NotBuilding
✅ DeleteAsync_WhileBuilding
✅ StartBuildAsync

✅ Serval.Machine.Shared.Services.PreprocessBuildJobTests

✅ ParallelCorpusAsync
✅ ParallelCorpusAsync_UseKeyTerms
✅ ParallelCorpusAsync_UseKeyTerms_TextIds
✅ RunAsync_DisableKeyTerms
✅ RunAsync_EnableKeyTerms
✅ RunAsync_FilterOutEverything
✅ RunAsync_InferenceChapters
✅ RunAsync_InferenceTextIds
✅ RunAsync_InferenceTextIdsOverlapWithTrainOnTextIds
✅ RunAsync_MixedSource_Paratext
✅ RunAsync_MixedSource_Text
✅ RunAsync_OnlyParseSelectedBooks_NoBadBooks
✅ RunAsync_OnlyParseSelectedBooks_PretranslateOnBadBook
✅ RunAsync_OnlyParseSelectedBooks_TrainOnBadBook
✅ RunAsync_PretranslateAll
✅ RunAsync_RemoveFreestandingEllipses
✅ RunAsync_TrainAndPretranslateAll
✅ RunAsync_TrainOnAll
✅ RunAsync_TrainOnChapters
✅ RunAsync_TrainOnTextIds
✅ RunAsync_UnknownLanguageTagsNoData
✅ RunAsync_UnknownLanguageTagsNoDataSmtTransfer

✅ Serval.Machine.Shared.Services.ServalPlatformOutboxMessageHandlerTests

✅ HandleMessageAsync_BuildStarted
✅ HandleMessageAsync_InsertInferences

✅ Serval.Machine.Shared.Services.SmtTransferEngineServiceTests

✅ CancelBuildAsync_Building(ClearML)
✅ CancelBuildAsync_Building(Hangfire)
✅ CancelBuildAsync_NotBuilding
✅ CommitAsync_LoadedActive
✅ CommitAsync_LoadedInactive
✅ CreateAsync
✅ DeleteAsync_WhileBuilding(ClearML)
✅ DeleteAsync_WhileBuilding(Hangfire)
✅ GetWordGraphAsync
✅ StartBuildAsync_RestartUnfinishedBuild
✅ StartBuildAsync(ClearML)
✅ StartBuildAsync(Hangfire)
✅ TrainSegmentPairAsync(ClearML)
✅ TrainSegmentPairAsync(Hangfire)
✅ TranslateAsync

❌ src/Serval/test/Serval.ApiServer.IntegrationTests/TestResults/test-results.trx

228 tests were completed in 766s with 227 passed, 1 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Serval.ApiServer.DataFilesTests 23✅ 68s
Serval.ApiServer.StatusTests 4✅ 10s
Serval.ApiServer.TranslationEngineTests 118✅ 386s
Serval.ApiServer.WebhooksTests 11✅ 25s
Serval.ApiServer.WordAlignmentEngineTests 71✅ 1❌ 268s

✅ Serval.ApiServer.DataFilesTests

✅ CreateAsync(["create:files", "read:files"],201)
✅ CreateAsync(["create:files", "read:files"],400)
✅ CreateAsync(["read:files"],403)
✅ DeleteAsync(["delete:files", "read:files"],200,"000000000000000000000001")
✅ DeleteAsync(["delete:files", "read:files"],403,"000000000000000000000003")
✅ DeleteAsync(["delete:files", "read:files"],404,"000000000000000000000004")
✅ DeleteAsync(["read:files"],403,"000000000000000000000001")
✅ DownloadAsync(["create:files", "read:files"],200,"")
✅ DownloadAsync(["create:files", "read:files"],403,"000000000000000000000003")
✅ DownloadAsync(["create:files", "read:files"],404,"000000000000000000000004")
✅ DownloadAsync(["create:files", "update:files"],403,"")
✅ GetAllAsync(["create:translation_engines"],403)
✅ GetAllAsync(["read:files"],200)
✅ GetByIDAsync(["create:translation_engines"],403,"000000000000000000000001")
✅ GetByIDAsync(["read:files"],200,"000000000000000000000001")
✅ GetByIDAsync(["read:files"],403,"000000000000000000000003")
✅ GetByIDAsync(["read:files"],404,"000000000000000000000004")
✅ GetByIDAsync(["read:files"],404,"phony_id")
✅ UpdateAsync(["read:files"],403,"000000000000000000000001")
✅ UpdateAsync(["update:files", "read:files"],200,"000000000000000000000001")
✅ UpdateAsync(["update:files", "read:files"],400,"000000000000000000000001")
✅ UpdateAsync(["update:files", "read:files"],403,"000000000000000000000003")
✅ UpdateAsync(["update:files", "read:files"],404,"000000000000000000000004")

✅ Serval.ApiServer.StatusTests

✅ GetDeploymentAsync(["create:translation_engines"],403)
✅ GetDeploymentAsync(["read:status"],200)
✅ GetHealthAsync(["create:translation_engines"],403)
✅ GetHealthAsync(["read:status"],200)

✅ Serval.ApiServer.TranslationEngineTests

✅ AddCorpusToEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ AddCorpusToEngineByIdAsync(["update:translation_engines"],201,"e00000000000000000000001")
✅ AddCorpusToEngineByIdAsync(["update:translation_engines"],404,"e00000000000000000000004")
✅ AddParallelCorpusToEngineById_NotAuthorized
✅ AddParallelCorpusToEngineByIdAsync
✅ CancelCurrentBuildForEngineByIdAsync(["read:files"],403,"e00000000000000000000001",False)
✅ CancelCurrentBuildForEngineByIdAsync(["update:translation_engines"],200,"e00000000000000000000001")
✅ CancelCurrentBuildForEngineByIdAsync(["update:translation_engines"],204,"e00000000000000000000001",False)
✅ CancelCurrentBuildForEngineByIdAsync(["update:translation_engines"],404,"e00000000000000000000004",False)
✅ CreateEngineAsync(["create:translation_engines", "read:translation_engines"],201,"Echo")
✅ CreateEngineAsync(["create:translation_engines"],400,"NotARealKindOfMT")
✅ CreateEngineAsync(["read:files"],403,"Echo")
✅ DataFileUpdate_Propagated
✅ DeleteCorpusAndFilesAsync
✅ DeleteCorpusButNotFilesAsync
✅ DeleteCorpusByIdForEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ DeleteCorpusByIdForEngineByIdAsync(["update:translation_engines", "read:translation_engines"],200,"e00000000000000000000001")
✅ DeleteCorpusByIdForEngineByIdAsync(["update:translation_engines", "read:translation_engines"],404,"e00000000000000000000001")
✅ DeleteCorpusByIdForEngineByIdAsync(["update:translation_engines", "read:translation_engines"],404,"e00000000000000000000004")
✅ DeleteEngineByIdAsync(["delete:translation_engines", "read:translation_engines"],200,"e00000000000000000000001")
✅ DeleteEngineByIdAsync(["delete:translation_engines"],404,"e00000000000000000000004")
✅ DeleteEngineByIdAsync(["read:translation_engines"],403,"e00000000000000000000001")
✅ DeleteParallelCorpusByIdForEngineById_NoSuchCorpus
✅ DeleteParallelCorpusByIdForEngineById_NoSuchEngine
✅ DeleteParallelCorpusByIdForEngineById_NotAuthorized
✅ DeleteParallelCorpusByIdForEngineByIdAsync
✅ GetAllAsync(["read:files"],403)
✅ GetAllAsync(["read:translation_engines"],200)
✅ GetAllBuildsForEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ GetAllBuildsForEngineByIdAsync(["read:translation_engines"],200,"be0000000000000000000001")
✅ GetAllBuildsForEngineByIdAsync(["read:translation_engines"],404,"e00000000000000000000004",False)
✅ GetAllCorporaForEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ GetAllCorporaForEngineByIdAsync(["update:translation_engines", "create:translation_engines", "read:translation_engines"],200,"e00000000000000000000001")
✅ GetAllCorporaForEngineByIdAsync(["update:translation_engines", "create:translation_engines", "read:translation_engines"],404,"e00000000000000000000004")
✅ GetAllParallelCorporaForEngineById_NoSuchEngine
✅ GetAllParallelCorporaForEngineById_NotAuthorized
✅ GetAllParallelCorporaForEngineByIdAsync
✅ GetAllPretranslationsAsync_CorpusDoesNotExist
✅ GetAllPretranslationsAsync_EngineDoesNotExist
✅ GetAllPretranslationsAsync_EngineNotBuilt
✅ GetAllPretranslationsAsync_Exists
✅ GetAllPretranslationsAsync_TextIdDoesNotExist
✅ GetAllPretranslationsAsync_TextIdExists
✅ GetBuildByIdForEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ GetBuildByIdForEngineByIdAsync(["read:translation_engines"],200,"be0000000000000000000001")
✅ GetBuildByIdForEngineByIdAsync(["read:translation_engines"],404,"be0000000000000000000001",False)
✅ GetBuildByIdForEngineByIdAsync(["read:translation_engines"],404,"e00000000000000000000004",False)
✅ GetBuildByIdForEngineByIdAsync(["read:translation_engines"],408,"be0000000000000000000001",True)
✅ GetByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ GetByIdAsync(["read:translation_engines"],200,"e00000000000000000000001")
✅ GetByIdAsync(["read:translation_engines"],403,"e00000000000000000000003")
✅ GetByIdAsync(["read:translation_engines"],404,"e00000000000000000000004")
✅ GetByIdAsync(["read:translation_engines"],404,"phony_id")
✅ GetCorpusByIdForEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ GetCorpusByIdForEngineByIdAsync(["update:translation_engines", "read:translation_engines"],200,"e00000000000000000000001",True)
✅ GetCorpusByIdForEngineByIdAsync(["update:translation_engines", "read:translation_engines"],404,"e00000000000000000000001",True)
✅ GetCorpusByIdForEngineByIdAsync(["update:translation_engines", "read:translation_engines"],404,"e00000000000000000000001")
✅ GetCorpusByIdForEngineByIdAsync(["update:translation_engines", "read:translation_engines"],404,"e00000000000000000000004")
✅ GetCurrentBuildForEngineByIdAsync(["read:files"],403,"e00000000000000000000001",False)
✅ GetCurrentBuildForEngineByIdAsync(["read:translation_engines"],200,"e00000000000000000000001")
✅ GetCurrentBuildForEngineByIdAsync(["read:translation_engines"],204,"e00000000000000000000001",False)
✅ GetCurrentBuildForEngineByIdAsync(["read:translation_engines"],404,"e00000000000000000000004",False)
✅ GetCurrentBuildForEngineByIdAsync(["read:translation_engines"],408,"e00000000000000000000001")
✅ GetDownloadableUrl(["read:files"],403,"e00000000000000000000001")
✅ GetDownloadableUrl(["read:translation_engines"],200,"e00000000000000000000001")
✅ GetDownloadableUrl(["read:translation_engines"],404,"e00000000000000000000004")
✅ GetLanguageInfo_Error
✅ GetLanguageInfoAsync
✅ GetParallelCorpusByIdForEngineById_NoCorpora
✅ GetParallelCorpusByIdForEngineById_NoSuchCorpus
✅ GetParallelCorpusByIdForEngineById_NoSuchEngine
✅ GetParallelCorpusByIdForEngineById_NotAuthorized
✅ GetParallelCorpusByIdForEngineByIdAsync
✅ GetPretranslatedUsfmAsync_BookDoesNotExist
✅ GetPretranslatedUsfmAsync_BookExists
✅ GetPretranslationsByTextId
✅ GetPretranslationsByTextId_EngineDoesNotExist
✅ GetQueueAsync_NotAuthorized
✅ GetQueueAsync("Echo")
✅ GetQueueAsync("Nmt")
✅ GetWordGraphForSegmentByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ GetWordGraphForSegmentByIdAsync(["read:translation_engines", "update:translation_engines"],200,"e00000000000000000000001")
✅ GetWordGraphForSegmentByIdAsync(["read:translation_engines", "update:translation_engines"],404,"e00000000000000000000004")
✅ GetWordGraphForSegmentByIdAsync(["read:translation_engines", "update:translation_engines"],409,"e00000000000000000000001")
✅ StartBuildAsync_Corpus_NoFilter
✅ StartBuildAsync_ParallelCorpus
✅ StartBuildAsync_ParallelCorpus_NoFilter
✅ StartBuildAsync_ParallelCorpus_PretranslateFilterOnMultipleSources
✅ StartBuildAsync_ParallelCorpus_PretranslateNoCorpusSpecified
✅ StartBuildAsync_ParallelCorpus_PretranslateParallelAndNormalCorpus
✅ StartBuildAsync_ParallelCorpus_TrainOnNoCorpusSpecified
✅ StartBuildAsync_ParallelCorpus_TrainOnParallelAndNormalCorpus
✅ StartBuildForEngineAsync_UnparsableOptions()
✅ StartBuildForEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ StartBuildForEngineByIdAsync(["update:translation_engines", "create:translation_engines", "read:translation_engines"],201,"e00000000000000000000001")
✅ StartBuildForEngineByIdAsync(["update:translation_engines", "create:translation_engines", "read:translation_engines"],400,"e00000000000000000000001")
✅ StartBuildForEngineByIdAsync(["update:translation_engines", "create:translation_engines", "read:translation_engines"],404,"e00000000000000000000004")
✅ TrainEngineByIdOnSegmentPairAsync(["read:files"],403,"e00000000000000000000001")
✅ TrainEngineByIdOnSegmentPairAsync(["update:translation_engines"],200,"e00000000000000000000001")
✅ TrainEngineByIdOnSegmentPairAsync(["update:translation_engines"],404,"e00000000000000000000004")
✅ TrainEngineByIdOnSegmentPairAsync(["update:translation_engines"],409,"e00000000000000000000001")
✅ TranslateNSegmentWithEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ TranslateNSegmentWithEngineByIdAsync(["read:translation_engines", "update:translation_engines"],200,"e00000000000000000000001")
✅ TranslateNSegmentWithEngineByIdAsync(["read:translation_engines", "update:translation_engines"],409,"e00000000000000000000001")
✅ TranslateNSegmentWithEngineByIdAsync(["read:translation_engines"],404,"e00000000000000000000004")
✅ TranslateSegmentWithEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ TranslateSegmentWithEngineByIdAsync(["read:translation_engines", "update:translation_engines"],200,"e00000000000000000000001")
✅ TranslateSegmentWithEngineByIdAsync(["read:translation_engines", "update:translation_engines"],404,"e00000000000000000000004")
✅ TranslateSegmentWithEngineByIdAsync(["read:translation_engines", "update:translation_engines"],409,"e00000000000000000000001")
✅ TryToQueueMultipleBuildsPerSingleUser
✅ UpdateCorpusByIdForEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ UpdateCorpusByIdForEngineByIdAsync(["update:translation_engines", "create:translation_engines", "read:translation_engines"],200,"e00000000000000000000001")
✅ UpdateCorpusByIdForEngineByIdAsync(["update:translation_engines", "create:translation_engines", "read:translation_engines"],404,"e00000000000000000000001")
✅ UpdateCorpusByIdForEngineByIdAsync(["update:translation_engines", "create:translation_engines", "read:translation_engines"],404,"e00000000000000000000004")
✅ UpdateParallelCorpusByIdForEngineById_NoSuchCorpus
✅ UpdateParallelCorpusByIdForEngineById_NoSuchEngine
✅ UpdateParallelCorpusByIdForEngineById_NotAuthorized
✅ UpdateParallelCorpusByIdForEngineByIdAsync

✅ Serval.ApiServer.WebhooksTests

✅ CreateWebhookAsync(["read:files"],403)
✅ CreateWebhookAsync(null,201)
✅ DeleteWebhookByIdAsync(["read:files"],403,"000000000000000000000000")
✅ DeleteWebhookByIdAsync(null,200,"000000000000000000000000")
✅ DeleteWebhookByIdAsync(null,404,"000000000000000000000001")
✅ GetAllWebhooksAsync(["read:files"],403)
✅ GetAllWebhooksAsync(null,200)
✅ GetWebhookByIdAsync(["read:files"],403,"000000000000000000000000")
✅ GetWebhookByIdAsync(null,200,"000000000000000000000000")
✅ GetWebhookByIdAsync(null,404,"000000000000000000000001")
✅ GetWebhookByIdAsync(null,404,"phony_id")

❌ Serval.ApiServer.WordAlignmentEngineTests

✅ AddParallelCorpusToEngineById_NotAuthorized
✅ AddParallelCorpusToEngineByIdAsync
✅ CancelCurrentBuildForEngineByIdAsync(["read:files"],403,"e00000000000000000000001",False)
✅ CancelCurrentBuildForEngineByIdAsync(["update:word_alignment_engines"],200,"e00000000000000000000001")
✅ CancelCurrentBuildForEngineByIdAsync(["update:word_alignment_engines"],204,"e00000000000000000000001",False)
✅ CancelCurrentBuildForEngineByIdAsync(["update:word_alignment_engines"],404,"e00000000000000000000004",False)
✅ CreateEngineAsync(["create:word_alignment_engines", "read:word_alignment_engines"],201,"EchoWordAlignment")
✅ CreateEngineAsync(["create:word_alignment_engines"],400,"NotARealKindOfMT")
✅ CreateEngineAsync(["read:files"],403,"EchoWordAlignment")
✅ DataFileUpdate_Propagated
✅ DeleteEngineByIdAsync(["delete:word_alignment_engines", "read:word_alignment_engines"],200,"e00000000000000000000001")
✅ DeleteEngineByIdAsync(["delete:word_alignment_engines"],404,"e00000000000000000000004")
✅ DeleteEngineByIdAsync(["read:word_alignment_engines"],403,"e00000000000000000000001")
✅ DeleteParallelCorpusByIdForEngineById_NoSuchCorpus
✅ DeleteParallelCorpusByIdForEngineById_NoSuchEngine
✅ DeleteParallelCorpusByIdForEngineById_NotAuthorized
✅ DeleteParallelCorpusByIdForEngineByIdAsync
✅ GetAllAsync(["read:files"],403)
✅ GetAllAsync(["read:word_alignment_engines"],200)
✅ GetAllBuildsForEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ GetAllBuildsForEngineByIdAsync(["read:word_alignment_engines"],200,"be0000000000000000000001")
✅ GetAllBuildsForEngineByIdAsync(["read:word_alignment_engines"],404,"e00000000000000000000004",False)
✅ GetAllParallelCorporaForEngineById_NoSuchEngine
✅ GetAllParallelCorporaForEngineById_NotAuthorized
✅ GetAllParallelCorporaForEngineByIdAsync
✅ GetAllWordAlignmentsAsync_CorpusDoesNotExist
✅ GetAllWordAlignmentsAsync_EngineDoesNotExist
✅ GetAllWordAlignmentsAsync_EngineNotBuilt
✅ GetAllWordAlignmentsAsync_Exists
✅ GetAllWordAlignmentsAsync_TextIdDoesNotExist
✅ GetAllWordAlignmentsAsync_TextIdExists
✅ GetBuildByIdForEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ GetBuildByIdForEngineByIdAsync(["read:word_alignment_engines"],200,"be0000000000000000000001")
✅ GetBuildByIdForEngineByIdAsync(["read:word_alignment_engines"],404,"be0000000000000000000001",False)
✅ GetBuildByIdForEngineByIdAsync(["read:word_alignment_engines"],404,"e00000000000000000000004",False)
✅ GetBuildByIdForEngineByIdAsync(["read:word_alignment_engines"],408,"be0000000000000000000001",True)
✅ GetByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ GetByIdAsync(["read:word_alignment_engines"],200,"e00000000000000000000001")
✅ GetByIdAsync(["read:word_alignment_engines"],403,"e00000000000000000000003")
✅ GetByIdAsync(["read:word_alignment_engines"],404,"e00000000000000000000004")
✅ GetByIdAsync(["read:word_alignment_engines"],404,"phony_id")
✅ GetCurrentBuildForEngineByIdAsync(["read:files"],403,"e00000000000000000000001",False)
✅ GetCurrentBuildForEngineByIdAsync(["read:word_alignment_engines"],200,"e00000000000000000000001")
✅ GetCurrentBuildForEngineByIdAsync(["read:word_alignment_engines"],204,"e00000000000000000000001",False)
✅ GetCurrentBuildForEngineByIdAsync(["read:word_alignment_engines"],404,"e00000000000000000000004",False)
✅ GetCurrentBuildForEngineByIdAsync(["read:word_alignment_engines"],408,"e00000000000000000000001")
✅ GetParallelCorpusByIdForEngineById_NoCorpora
✅ GetParallelCorpusByIdForEngineById_NoSuchCorpus
✅ GetParallelCorpusByIdForEngineById_NoSuchEngine
✅ GetParallelCorpusByIdForEngineById_NotAuthorized
✅ GetParallelCorpusByIdForEngineByIdAsync
✅ GetWordAlignmentsByTextId
✅ GetWordAlignmentsByTextId_EngineDoesNotExist
✅ StartBuildAsync_ParallelCorpus
✅ StartBuildAsync_ParallelCorpus_NoFilter
✅ StartBuildAsync_ParallelCorpus_PretranslateFilterOnMultipleSources
✅ StartBuildAsync_ParallelCorpus_PretranslateNoCorpusSpecified
✅ StartBuildAsync_ParallelCorpus_TrainOnNoCorpusSpecified
✅ StartBuildForEngineAsync_UnparsableOptions()
✅ StartBuildForEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
✅ StartBuildForEngineByIdAsync(["update:word_alignment_engines", "create:word_alignment_engines", "read:word_alignment_engines"],201,"e00000000000000000000001")
✅ StartBuildForEngineByIdAsync(["update:word_alignment_engines", "create:word_alignment_engines", "read:word_alignment_engines"],400,"e00000000000000000000001")
✅ StartBuildForEngineByIdAsync(["update:word_alignment_engines", "create:word_alignment_engines", "read:word_alignment_engines"],404,"e00000000000000000000004")
✅ TranslateSegmentWithEngineByIdAsync(["read:files"],403,"e00000000000000000000001")
❌ TranslateSegmentWithEngineByIdAsync(["read:word_alignment_engines", "update:word_alignment_engines"],200,"e00000000000000000000001")
	NSubstitute.Exceptions.RedundantArgumentMatcherException : Some argument specifications (e.g. Arg.Is, Arg.Any) were left over after the last call.
	
	This is often caused by using an argument spec with a call to a member NSubstitute does not handle (such as a non-virtual member or a call to an instance which is not a substitute), or for a purpose other than specifying a call (such as using an arg spec as a return value). For example:
	
	    var sub = Substitute.For<SomeClass>();
	    var realType = new MyRealType(sub);
	    // INCORRECT, arg spec used on realType, not a substitute:
	    realType.SomeMethod(Arg.Any<int>()).Returns(2);
	    // INCORRECT, arg spec used as a return value, not to specify a call:
	    sub.VirtualMethod(2).Returns(Arg.Any<int>());
	    // INCORRECT, arg spec used with a non-virtual method:
	    sub.NonVirtualMethod(Arg.Any<int>()).Returns(2);
	    // CORRECT, arg spec used to specify virtual call on a substitute:
	    sub.VirtualMethod(Arg.Any<int>()).Returns(2);
	
	To fix this make sure you only use argument specifications with calls to substitutes. If your substitute is a class, make sure the member is virtual.
	
	Another possible cause is that the argument spec type does not match the actual argument type, but code compiles due to an implicit cast. For example, Arg.Any<int>() was used, but Arg.Any<double>() was required.
	
	NOTE: the cause of this exception can be in a previously executed test. Use the diagnostics below to see the types of any redundant arg specs, then work out where they are being created.
	
	Diagnostic information:
	
	Remaining (non-bound) argument specifications:
	    any CancellationToken
	
	All argument specifications:
	    any CancellationToken
	
✅ TranslateSegmentWithEngineByIdAsync(["read:word_alignment_engines", "update:word_alignment_engines"],404,"e00000000000000000000004")
✅ TranslateSegmentWithEngineByIdAsync(["read:word_alignment_engines", "update:word_alignment_engines"],409,"e00000000000000000000001")
✅ TryToQueueMultipleBuildsPerSingleUser
✅ UpdateParallelCorpusByIdForEngineById_NoSuchCorpus
✅ UpdateParallelCorpusByIdForEngineById_NoSuchEngine
✅ UpdateParallelCorpusByIdForEngineById_NotAuthorized
✅ UpdateParallelCorpusByIdForEngineByIdAsync

✅ src/Serval/test/Serval.DataFiles.Tests/TestResults/test-results.trx

11 tests were completed in 11s with 11 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Serval.DataFiles.Services.CorpusServiceTests 2✅ 288ms
Serval.DataFiles.Services.DataFileServiceTests 8✅ 104ms
Serval.DataFiles.Services.DeletedFileCleanerTests 1✅ 2s

✅ Serval.DataFiles.Services.CorpusServiceTests

✅ CreateAsync
✅ UpdateAsync

✅ Serval.DataFiles.Services.DataFileServiceTests

✅ CreateAsync_Error
✅ CreateAsync_NoError
✅ DeleteAsync_DoesNotExist
✅ DeleteAsync_Exists
✅ DownloadAsync_DoesNotExists
✅ DownloadAsync_Exists
✅ UpdateAsync_DoesNotExist
✅ UpdateAsync_Exists

✅ Serval.DataFiles.Services.DeletedFileCleanerTests

✅ Clean

✅ src/Serval/test/Serval.E2ETests/TestResults/test-results.trx

No tests found

✅ src/Serval/test/Serval.Shared.Tests/TestResults/test-results.trx

3 tests were completed in 6s with 3 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Serval.Shared.Services.ScriptureDataFileServiceTests 2✅ 184ms
Serval.Shared.Utils.ObjectToInferredTypesConverterTest 1✅ 62ms

✅ Serval.Shared.Services.ScriptureDataFileServiceTests

✅ GetParatextProjectSettings
✅ GetZipParatextProjectTextUpdater

✅ Serval.Shared.Utils.ObjectToInferredTypesConverterTest

✅ Convert

✅ src/Serval/test/Serval.Translation.Tests/TestResults/test-results.trx

50 tests were completed in 10s with 50 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Serval.Translation.Services.BuildCleanupServiceTests 1✅ 212ms
Serval.Translation.Services.BuildServiceTests 4✅ 77ms
Serval.Translation.Services.EngineCleanupServiceTests 1✅ 32ms
Serval.Translation.Services.EngineServiceTests 30✅ 970ms
Serval.Translation.Services.PlatformServiceTests 3✅ 229ms
Serval.Translation.Services.PretranslationServiceTests 11✅ 823ms

✅ Serval.Translation.Services.BuildCleanupServiceTests

✅ CleanupAsync

✅ Serval.Translation.Services.BuildServiceTests

✅ GetActiveNewerRevisionAsync_Insert
✅ GetNewerRevisionAsync_Delete
✅ GetNewerRevisionAsync_DoesNotExist
✅ GetNewerRevisionAsync_Update

✅ Serval.Translation.Services.EngineCleanupServiceTests

✅ CleanupAsync

✅ Serval.Translation.Services.EngineServiceTests

✅ CancelBuildAsync_EngineExistsNotBuilding
✅ CreateAsync
✅ DeleteAsync_EngineExists
✅ DeleteAsync_ProjectDoesNotExist
✅ GetWordGraphAsync_EngineDoesNotExist
✅ GetWordGraphAsync_EngineExists
✅ StartBuildAsync_MixedSourceAndTarget_ParallelCorpus
✅ StartBuildAsync_NoFilters_ParallelCorpus
✅ StartBuildAsync_NoTargetFilter_ParallelCorpus
✅ StartBuildAsync_OneOfMultipleCorpora
✅ StartBuildAsync_ParallelCorpus_OneOfMultipleCorpora
✅ StartBuildAsync_ParallelCorpus_TextFiles
✅ StartBuildAsync_ParallelCorpus_TrainOnOnePretranslateTheOther
✅ StartBuildAsync_ScriptureRange_ParallelCorpus
✅ StartBuildAsync_ScriptureRangeEmptyString
✅ StartBuildAsync_ScriptureRangeSpecified
✅ StartBuildAsync_TextFilesScriptureRangeSpecified
✅ StartBuildAsync_TextFilesScriptureRangeSpecified_ParallelCorpus
✅ StartBuildAsync_TextIds_ParallelCorpus
✅ StartBuildAsync_TextIdsEmpty
✅ StartBuildAsync_TextIdsNotSpecified
✅ StartBuildAsync_TextIdsPopulated
✅ StartBuildAsync_TrainOnNotSpecified
✅ StartBuildAsync_TrainOnNotSpecified_ParallelCorpus
✅ StartBuildAsync_TrainOnOnePretranslateTheOther
✅ TrainSegmentAsync_EngineDoesNotExist
✅ TrainSegmentAsync_EngineExists
✅ TranslateAsync_EngineDoesNotExist
✅ TranslateAsync_EngineExists
✅ UpdateCorpusAsync

✅ Serval.Translation.Services.PlatformServiceTests

✅ IncrementCorpusSizeAsync
✅ TestBuildStateTransitionsAsync
✅ UpdateBuildStatusAsync

✅ Serval.Translation.Services.PretranslationServiceTests

✅ GetUsfmAsync_Auto_TargetBookDoesNotExist
✅ GetUsfmAsync_Auto_TargetBookExists
✅ GetUsfmAsync_Source_OnlyExisting
✅ GetUsfmAsync_Source_OnlyPretranslated
✅ GetUsfmAsync_Source_PreferExisting
✅ GetUsfmAsync_Source_PreferPretranslated
✅ GetUsfmAsync_Target_OnlyExisting
✅ GetUsfmAsync_Target_OnlyPretranslated
✅ GetUsfmAsync_Target_PreferExisting
✅ GetUsfmAsync_Target_PreferPretranslated
✅ GetUsfmAsync_Target_TargetBookDoesNotExist

✅ src/Serval/test/Serval.Webhooks.Tests/TestResults/test-results.trx

5 tests were completed in 7s with 5 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Serval.Webhooks.Services.WebhookJobTests 5✅ 131ms

✅ Serval.Webhooks.Services.WebhookJobTests

✅ RunAsync_Exception
✅ RunAsync_MatchingHook
✅ RunAsync_NoHooks
✅ RunAsync_NoMatchingHook
✅ RunAsync_RequestTimeout

✅ src/Serval/test/Serval.WordAlignment.Tests/TestResults/test-results.trx

27 tests were completed in 7s with 27 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
Serval.WordAlignment.Services.BuildCleanupServiceTests 1✅ 141ms
Serval.WordAlignment.Services.BuildServiceTests 4✅ 70ms
Serval.WordAlignment.Services.EngineCleanupServiceTests 1✅ 29ms
Serval.WordAlignment.Services.EngineServiceTests 18✅ 444ms
Serval.WordAlignment.Services.PlatformServiceTests 3✅ 110ms

✅ Serval.WordAlignment.Services.BuildCleanupServiceTests

✅ CleanupAsync

✅ Serval.WordAlignment.Services.BuildServiceTests

✅ GetActiveNewerRevisionAsync_Insert
✅ GetNewerRevisionAsync_Delete
✅ GetNewerRevisionAsync_DoesNotExist
✅ GetNewerRevisionAsync_Update

✅ Serval.WordAlignment.Services.EngineCleanupServiceTests

✅ CleanupAsync

✅ Serval.WordAlignment.Services.EngineServiceTests

✅ CancelBuildAsync_EngineExistsNotBuilding
✅ CreateAsync
✅ DeleteAsync_EngineExists
✅ DeleteAsync_ProjectDoesNotExist
✅ GetWordAlignmentAsync_EngineDoesNotExist
✅ GetWordAlignmentAsync_EngineExists
✅ StartBuildAsync_MixedSourceAndTarget
✅ StartBuildAsync_NoTargetFilter
✅ StartBuildAsync_OneOfMultipleCorpora
✅ StartBuildAsync_ScriptureRangeEmptyString
✅ StartBuildAsync_ScriptureRangeSpecified
✅ StartBuildAsync_TextFilesScriptureRangeSpecified
✅ StartBuildAsync_TextIdsEmpty
✅ StartBuildAsync_TextIdsNotSpecified
✅ StartBuildAsync_TextIdsPopulated
✅ StartBuildAsync_TrainOnNotSpecified
✅ StartBuildAsync_TrainOnOneWordAlignTheOther
✅ UpdateCorpusAsync

✅ Serval.WordAlignment.Services.PlatformServiceTests

✅ IncrementCorpusSizeAsync
✅ TestBuildStateTransitionsAsync
✅ UpdateBuildStatusAsync

✅ src/ServiceToolkit/test/SIL.ServiceToolkit.Tests/TestResults/test-results.trx

1 tests were completed in 5s with 1 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
SIL.ServiceToolkit.Services.ParallelCorpusPreprocessingServiceTests 1✅ 72ms

✅ SIL.ServiceToolkit.Services.ParallelCorpusPreprocessingServiceTests

✅ TestParallelCorpusPreprocessor

Annotations

Check failure on line 1667 in src/Serval/test/Serval.ApiServer.IntegrationTests/WordAlignmentEngineTests.cs

See this annotation in the file changed.

@github-actions github-actions / NUnit Tests

Serval.ApiServer.WordAlignmentEngineTests ► TranslateSegmentWithEngineByIdAsync(["read:word_alignment_engines", "update:word_alignment_engines"],200,"e00000000000000000000001")

Failed test found in:
  src/Serval/test/Serval.ApiServer.IntegrationTests/TestResults/test-results.trx
Error:
  NSubstitute.Exceptions.RedundantArgumentMatcherException : Some argument specifications (e.g. Arg.Is, Arg.Any) were left over after the last call.
  
  This is often caused by using an argument spec with a call to a member NSubstitute does not handle (such as a non-virtual member or a call to an instance which is not a substitute), or for a purpose other than specifying a call (such as using an arg spec as a return value). For example:
  
      var sub = Substitute.For<SomeClass>();
      var realType = new MyRealType(sub);
      // INCORRECT, arg spec used on realType, not a substitute:
      realType.SomeMethod(Arg.Any<int>()).Returns(2);
      // INCORRECT, arg spec used as a return value, not to specify a call:
      sub.VirtualMethod(2).Returns(Arg.Any<int>());
      // INCORRECT, arg spec used with a non-virtual method:
      sub.NonVirtualMethod(Arg.Any<int>()).Returns(2);
      // CORRECT, arg spec used to specify virtual call on a substitute:
      sub.VirtualMethod(Arg.Any<int>()).Returns(2);
  
  To fix this make sure you only use argument specifications with calls to substitutes. If your substitute is a class, make sure the member is virtual.
  
  Another possible cause is that the argument spec type does not match the actual argument type, but code compiles due to an implicit cast. For example, Arg.Any<int>() was used, but Arg.Any<double>() was required.
  
  NOTE: the cause of this exception can be in a previously executed test. Use the diagnostics below to see the types of any redundant arg specs, then work out where they are being created.
  
  Diagnostic information:
  
  Remaining (non-bound) argument specifications:
      any CancellationToken
  
  All argument specifications:
      any CancellationToken
  
Raw output
NSubstitute.Exceptions.RedundantArgumentMatcherException : Some argument specifications (e.g. Arg.Is, Arg.Any) were left over after the last call.

This is often caused by using an argument spec with a call to a member NSubstitute does not handle (such as a non-virtual member or a call to an instance which is not a substitute), or for a purpose other than specifying a call (such as using an arg spec as a return value). For example:

    var sub = Substitute.For<SomeClass>();
    var realType = new MyRealType(sub);
    // INCORRECT, arg spec used on realType, not a substitute:
    realType.SomeMethod(Arg.Any<int>()).Returns(2);
    // INCORRECT, arg spec used as a return value, not to specify a call:
    sub.VirtualMethod(2).Returns(Arg.Any<int>());
    // INCORRECT, arg spec used with a non-virtual method:
    sub.NonVirtualMethod(Arg.Any<int>()).Returns(2);
    // CORRECT, arg spec used to specify virtual call on a substitute:
    sub.VirtualMethod(Arg.Any<int>()).Returns(2);

To fix this make sure you only use argument specifications with calls to substitutes. If your substitute is a class, make sure the member is virtual.

Another possible cause is that the argument spec type does not match the actual argument type, but code compiles due to an implicit cast. For example, Arg.Any<int>() was used, but Arg.Any<double>() was required.

NOTE: the cause of this exception can be in a previously executed test. Use the diagnostics below to see the types of any redundant arg specs, then work out where they are being created.

Diagnostic information:

Remaining (non-bound) argument specifications:
    any CancellationToken

All argument specifications:
    any CancellationToken

   at NSubstitute.Core.Arguments.ArgumentSpecificationsFactory.Create(IList`1 argumentSpecs, Object[] arguments, IParameterInfo[] parameterInfos, MethodInfo methodInfo, MatchArgs matchArgs)
   at NSubstitute.Routing.Handlers.RecordCallSpecificationHandler.Handle(ICall call)
   at NSubstitute.Proxies.CastleDynamicProxy.CastleForwardingInterceptor.Intercept(IInvocation invocation)
   at Castle.DynamicProxy.AbstractInvocation.Proceed()
   at Castle.DynamicProxy.AbstractInvocation.Proceed()
   at Castle.Proxies.ObjectProxy.OpenZipFile(String path)
   at Serval.ApiServer.WordAlignmentEngineTests.TestEnvironment.CreateFileSystem(IServiceProvider sp) in /home/runner/work/serval/serval/src/Serval/test/Serval.ApiServer.IntegrationTests/WordAlignmentEngineTests.cs:line 1667
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite callSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass2_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
   at lambda_method5500(Closure, IServiceProvider, Object[])
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ExceptionContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Http.Timeouts.RequestTimeoutsMiddleware.<>c__DisplayClass5_0.<<Invoke>g__SetTimeoutAsync|0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at SIL.ServiceToolkit.Services.BugsnagMiddleware.Invoke(HttpContext context, IClient client) in /home/runner/work/serval/serval/src/ServiceToolkit/src/SIL.ServiceToolkit/Services/BugsnagMiddleware.cs:line 35
   at Microsoft.AspNetCore.TestHost.HttpContextBuilder.<>c__DisplayClass23_0.<<SendAsync>g__RunRequestAsync|0>d.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.TestHost.ClientHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Mvc.Testing.Handlers.CookieContainerHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Mvc.Testing.Handlers.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
   at Serval.Client.WordAlignmentEnginesClient.GetWordAlignmentAsync(String id, WordAlignmentRequest wordAlignmentRequest, CancellationToken cancellationToken) in /home/runner/work/serval/serval/src/Serval/src/Serval.Client/Client.g.cs:line 7742
   at Serval.ApiServer.WordAlignmentEngineTests.TranslateSegmentWithEngineByIdAsync(IEnumerable`1 scope, Int32 expectedStatusCode, String engineId) in /home/runner/work/serval/serval/src/Serval/test/Serval.ApiServer.IntegrationTests/WordAlignmentEngineTests.cs:line 351
   at NUnit.Framework.Internal.AsyncToSyncAdapter.Await[TResult](Func`1 invoke)
   at NUnit.Framework.Internal.Commands.TestMethodCommand.Execute(TestExecutionContext context)
   at NUnit.Framework.Internal.Commands.DelegatingTestCommand.RunTestMethodInThreadAbortSafeZone(TestExecutionContext context, Action action)