Skip to content

Commit e63520e

Browse files
authored
[LiftService] Extract internal methods for testing (#4169)
1 parent ea93cbd commit e63520e

File tree

2 files changed

+375
-94
lines changed

2 files changed

+375
-94
lines changed

Backend.Tests/Services/LiftServiceTests.cs

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
using System;
2+
using System.Linq;
3+
using BackendFramework.Helper;
24
using BackendFramework.Interfaces;
5+
using BackendFramework.Models;
36
using BackendFramework.Services;
47
using NUnit.Framework;
8+
using SIL.DictionaryServices.Model;
59

610
namespace Backend.Tests.Services
711
{
@@ -74,5 +78,247 @@ public void TestStoreRetrieveDeleteImport()
7478
Assert.That(_liftService.DeleteImport(UserId), Is.True);
7579
Assert.That(_liftService.RetrieveImport(UserId), Is.Null);
7680
}
81+
82+
[Test]
83+
public void TestCreateLexEntryWithoutAudio()
84+
{
85+
var project = Util.RandomProject();
86+
var word = Util.RandomWord(project.Id);
87+
word.Vernacular = "test'vern-with.punct&which;will\tbe\"escaped/later<by*lift writer";
88+
word.Created = "2020-01-01T00:00:00.000Z";
89+
word.Modified = "2021-02-03T04:05:06.789Z";
90+
word.Flag = new("flag text");
91+
word.Note = new("en", "note text");
92+
93+
var entry = LiftService.CreateLexEntryWithoutAudio(project, word, []);
94+
95+
Assert.That(entry.Id, Does.StartWith(word.Vernacular));
96+
Assert.That(entry.Id, Does.EndWith(word.Guid.ToString()));
97+
Assert.That(entry.Guid, Is.EqualTo(word.Guid));
98+
Assert.That(entry.CreationTime, Is.Not.EqualTo(default(DateTime)));
99+
Assert.That(entry.ModificationTime, Is.Not.EqualTo(default(DateTime)));
100+
Assert.That(entry.ModifiedTimeIsLocked, Is.True);
101+
102+
// Check vernacular
103+
var vernBcp47 = project.VernacularWritingSystem.Bcp47;
104+
var vernForm = entry.LexicalForm.Find(vernBcp47);
105+
Assert.That(vernForm, Is.Not.Null);
106+
Assert.That(vernForm.Form, Is.EqualTo(word.Vernacular));
107+
108+
// Check note
109+
Assert.That(entry.Notes, Has.Count.EqualTo(1));
110+
var noteForms = entry.Notes.First().Forms;
111+
Assert.That(noteForms, Has.Length.EqualTo(1));
112+
Assert.That(noteForms.First().Form, Is.EqualTo(word.Note.Text));
113+
114+
// Check flag
115+
var flagField = entry.Fields.FirstOrDefault(f => f.Type == LiftHelper.FlagFieldTag);
116+
Assert.That(flagField, Is.Not.Null);
117+
Assert.That(flagField.Forms, Has.Length.EqualTo(1));
118+
Assert.That(flagField.Forms.First().Form, Is.EqualTo(word.Flag.Text));
119+
120+
// Check senses
121+
Assert.That(entry.Senses, Has.Count.EqualTo(word.Senses.Count));
122+
123+
Assert.That(entry.Pronunciations, Is.Empty);
124+
}
125+
126+
[Test]
127+
public void TestCreateLexEntryWithoutAudioCitationForm()
128+
{
129+
var project = Util.RandomProject();
130+
var word = Util.RandomWord(project.Id);
131+
word.Vernacular = "citation-form-of-entry";
132+
word.UsingCitationForm = true;
133+
134+
var entry = LiftService.CreateLexEntryWithoutAudio(project, word, []);
135+
136+
var vernBcp47 = project.VernacularWritingSystem.Bcp47;
137+
var citationForm = entry.CitationForm.Find(vernBcp47);
138+
Assert.That(citationForm, Is.Not.Null);
139+
Assert.That(citationForm.Form, Is.EqualTo("citation-form-of-entry"));
140+
Assert.That(entry.LexicalForm.Find(vernBcp47), Is.Null);
141+
}
142+
143+
[Test]
144+
public void TestCreateLexEntryWithoutAudioFlagInactive()
145+
{
146+
var project = Util.RandomProject();
147+
var word = Util.RandomWord(project.Id);
148+
word.Flag = new() { Active = false, Text = "should not appear" };
149+
150+
var entry = LiftService.CreateLexEntryWithoutAudio(project, word, []);
151+
152+
var flagField = entry.Fields.FirstOrDefault(f => f.Type == LiftHelper.FlagFieldTag);
153+
Assert.That(flagField, Is.Null);
154+
}
155+
156+
[Test]
157+
public void TestCreateLexEntryWithoutAudioFlagTextEmptyFiller()
158+
{
159+
var project = Util.RandomProject();
160+
var word = Util.RandomWord(project.Id);
161+
word.Flag = new() { Active = true, Text = " " };
162+
163+
var entry = LiftService.CreateLexEntryWithoutAudio(project, word, []);
164+
165+
var flagField = entry.Fields.FirstOrDefault(f => f.Type == LiftHelper.FlagFieldTag);
166+
Assert.That(flagField, Is.Not.Null);
167+
Assert.That(flagField.Forms, Has.Length.EqualTo(1));
168+
Assert.That(flagField.Forms.First().Form, Is.EqualTo("***"));
169+
}
170+
171+
[Test]
172+
public void TestCreateLexEntryWithoutAudioBlankNote()
173+
{
174+
var project = Util.RandomProject();
175+
var word = Util.RandomWord(project.Id);
176+
word.Note = new();
177+
178+
var entry = LiftService.CreateLexEntryWithoutAudio(project, word, []);
179+
180+
Assert.That(entry.Notes, Is.Empty);
181+
}
182+
183+
[Test]
184+
public void TestCreateLexSense()
185+
{
186+
var sense = Util.RandomSense();
187+
sense.Definitions.Add(new() { Language = "fr", Text = "defr" });
188+
sense.Glosses.AddRange([new() { Language = "en", Def = "gen" }, new() { Language = "es", Def = "ges" }]);
189+
sense.GrammaticalInfo = new() { CatGroup = GramCatGroup.Noun, GrammaticalCategory = "n" };
190+
sense.SemanticDomains = [new() { Id = "1", Name = "Universe" }];
191+
192+
var lexSense = LiftService.CreateLexSense(sense, []);
193+
194+
Assert.That(lexSense.Id, Is.EqualTo(sense.Guid.ToString()));
195+
196+
// Check definition
197+
var frDef = lexSense.Definition.Find("fr");
198+
Assert.That(frDef, Is.Not.Null);
199+
Assert.That(frDef.Form, Is.EqualTo("defr"));
200+
201+
// Check glosses
202+
var enGloss = lexSense.Gloss.Find("en");
203+
Assert.That(enGloss, Is.Not.Null);
204+
Assert.That(enGloss.Form, Is.EqualTo("gen"));
205+
var esGloss = lexSense.Gloss.Find("es");
206+
Assert.That(esGloss, Is.Not.Null);
207+
Assert.That(esGloss.Form, Is.EqualTo("ges"));
208+
209+
// Check grammatical info
210+
var hasPos = lexSense.Properties.Any(p => p.Key == LexSense.WellKnownProperties.PartOfSpeech);
211+
Assert.That(hasPos, Is.True);
212+
213+
// Check semantic domains
214+
var semDomProps = lexSense.Properties
215+
.Where(p => p.Key == LexSense.WellKnownProperties.SemanticDomainDdp4).ToList();
216+
Assert.That(semDomProps, Has.Count.EqualTo(1));
217+
Assert.That(semDomProps.First().Value.ToString(), Is.EqualTo("1 Universe"));
218+
}
219+
220+
[Test]
221+
public void TestCreateLexSenseDuplicatesInALanguage()
222+
{
223+
var sense = new Sense
224+
{
225+
Definitions = [new() { Language = "en", Text = "1st" }, new() { Language = "en", Text = "2nd" }],
226+
Glosses = [new() { Language = "es", Def = "1o" }, new() { Language = "es", Def = "2o" }]
227+
};
228+
229+
var lexSense = LiftService.CreateLexSense(sense, []);
230+
231+
// Both definitions should be merged with default separator
232+
var enDef = lexSense.Definition.Find("en");
233+
Assert.That(enDef, Is.Not.Null);
234+
Assert.That(enDef.Form, Is.EqualTo("1st;2nd"));
235+
var esGloss = lexSense.Gloss.Find("es");
236+
Assert.That(esGloss, Is.Not.Null);
237+
Assert.That(esGloss.Form, Is.EqualTo("1o;2o"));
238+
}
239+
240+
[Test]
241+
public void TestCreateLexSenseCustomSeparator()
242+
{
243+
var sense = new Sense
244+
{
245+
Definitions = [new() { Language = "en", Text = "1st" }, new() { Language = "en", Text = "2nd" }]
246+
};
247+
248+
var lexSense = LiftService.CreateLexSense(sense, [], separator: " | ");
249+
250+
var enDef = lexSense.Definition.Find("en");
251+
Assert.That(enDef, Is.Not.Null);
252+
Assert.That(enDef.Form, Is.EqualTo("1st | 2nd"));
253+
}
254+
255+
[Test]
256+
public void TestCreateLexSenseNoGrammaticalInfo()
257+
{
258+
var sense = new Sense { GrammaticalInfo = new() { CatGroup = GramCatGroup.Unspecified } };
259+
260+
var lexSense = LiftService.CreateLexSense(sense, []);
261+
262+
var hasPos = lexSense.Properties.Any(p => p.Key == LexSense.WellKnownProperties.PartOfSpeech);
263+
Assert.That(hasPos, Is.False);
264+
}
265+
266+
[Test]
267+
public void TestCreateLexSenseSemanticDomainWithoutName()
268+
{
269+
var sense = new Sense { SemanticDomains = [new() { Id = "9.9" }] };
270+
271+
// Semantic domain not in dictionary
272+
var lexSense = LiftService.CreateLexSense(sense, []);
273+
274+
var semDomProps = lexSense.Properties
275+
.Where(p => p.Key == LexSense.WellKnownProperties.SemanticDomainDdp4).ToList();
276+
Assert.That(semDomProps, Has.Count.EqualTo(1));
277+
Assert.That(semDomProps.First().Value.ToString(), Is.EqualTo("9.9"));
278+
}
279+
280+
[Test]
281+
public void TestCreateLexSenseSemanticDomainPrefersNameFromDictionary()
282+
{
283+
var sense = new Sense { SemanticDomains = [new() { Id = "9.9", Name = "no!" }] };
284+
285+
// Semantic domain not in dictionary
286+
var lexSense = LiftService.CreateLexSense(sense, new() { ["9.9"] = "yes!" });
287+
288+
var semDomProps = lexSense.Properties
289+
.Where(p => p.Key == LexSense.WellKnownProperties.SemanticDomainDdp4).ToList();
290+
Assert.That(semDomProps, Has.Count.EqualTo(1));
291+
Assert.That(semDomProps.First().Value.ToString(), Does.EndWith("yes!"));
292+
}
293+
294+
[Test]
295+
public void TestCreateLexPhoneticNoSpeaker()
296+
{
297+
const string audioPath = "path/to/audio.wav";
298+
299+
var lexPhonetic = LiftService.CreateLexPhonetic(audioPath);
300+
301+
Assert.That(lexPhonetic.Forms, Has.Length.EqualTo(1));
302+
var hrefForm = lexPhonetic.Find("href");
303+
Assert.That(hrefForm, Is.Not.Null);
304+
Assert.That(hrefForm.Form, Is.EqualTo(audioPath));
305+
}
306+
307+
[Test]
308+
public void TestCreateLexPhoneticWithSpeaker()
309+
{
310+
const string audioPath = "path/to/audio.mp3";
311+
var speaker = new Speaker { Id = "speaker1", Name = "Mr. E", ProjectId = "proj1" };
312+
313+
var lexPhonetic = LiftService.CreateLexPhonetic(audioPath, speaker);
314+
315+
Assert.That(lexPhonetic.Forms, Has.Length.EqualTo(2));
316+
var hrefForm = lexPhonetic.Find("href");
317+
Assert.That(hrefForm, Is.Not.Null);
318+
Assert.That(hrefForm.Form, Is.EqualTo(audioPath));
319+
var speakerForm = lexPhonetic.Find("en");
320+
Assert.That(speakerForm, Is.Not.Null);
321+
Assert.That(speakerForm.Form, Is.EqualTo("Speaker: Mr. E"));
322+
}
77323
}
78324
}

0 commit comments

Comments
 (0)