public void InitFromUri_FullTypicalLangDepot_SelectedServerPathCorrect() { var m = new ServerSettingsModel(); m.InitFromUri("http://*****:*****@hg-public.languagedepot.org/tpi"); Assert.AreEqual("hg-public.languagedepot.org", m.SelectedServerPath); }
public void InitFromUri_FullTypicalLangDepot_PasswordCorrect() { var m = new ServerSettingsModel(); m.InitFromUri("http://*****:*****@hg-public.languagedepot.org/tpi"); Assert.AreEqual("pass", m.Password); }
public void InitFromUri_FullTypicalLangDepot_CustomUrlFalse() { var m = new ServerSettingsModel(); m.InitFromUri("http://*****:*****@hg-public.languagedepot.org/tpi"); Assert.IsFalse(m.CustomUrlSelected); }
public void InitFromUri_FullPrivateLangDepot_SelectedServerLabel() { var m = new ServerSettingsModel(); m.InitFromUri("http://*****:*****@hg-private.languagedepot.org/tpi"); Assert.AreEqual("LanguageDepot.org [private]".ToLower(), m.SelectedServerLabel.ToLower()); }
public void InitFromUri_HasFolderDesignator_IdIsCorrect() { var m = new ServerSettingsModel(); m.InitFromUri("https://*****:*****@hg-public.languageforge.org/tpi?localFolder=foo"); Assert.AreEqual("tpi", m.ProjectId); }
public void InitFromUri_LanguageDepot_ConvertedToLanguageForge(string subdomain, bool isResumable) { try { if (subdomain.Equals("hg-private")) { // Setting IsPrivateServer is necessary to prevent hg-private.languageforge.org being marked as custom. // If IsPrivateServer is set incorrectly (either way), the URL will be imported and scrubbed correctly, // but marked as custom (tested in other tests) ServerSettingsModel.IsPrivateServer = true; } var expectedNewHost = $"{subdomain}.languageforge.org"; var expectedBandwidth = isResumable ? ServerSettingsModel.BandwidthEnum.Low : ServerSettingsModel.BandwidthEnum.High; var m = new ServerSettingsModel(); // SUT // ReSharper disable once StringLiteralTypo - the old server used to be called Language Depot m.InitFromUri($"http://*****:*****@{subdomain}.languagedepot.org/mcx"); Assert.False(m.IsCustomUrl); Assert.AreEqual(expectedNewHost, m.Host); Assert.AreEqual("joe", m.Username); Assert.AreEqual("cool", m.Password); Assert.AreEqual(expectedBandwidth, m.Bandwidth.Value); Assert.AreEqual("mcx", m.ProjectId); Assert.AreEqual($"https://{expectedNewHost}/mcx", m.URL); } finally { ServerSettingsModel.IsPrivateServer = false; } }
public void InitFromUri_LANPathGiven_CustomUrlIsTrue() { var m = new ServerSettingsModel(); m.InitFromUri("\\mybox\tpi"); Assert.IsTrue(m.IsCustomUrl); }
public void InitFromUri_UnknownHttpGiven_CustomUrlIsTrue() { var m = new ServerSettingsModel(); m.InitFromUri("https://somewhereelse.net/xyz"); Assert.IsTrue(m.IsCustomUrl); }
public void InitFromUri_FullTypicalLangForge_AccountNameCorrect() { var m = new ServerSettingsModel(); m.InitFromUri("https://*****:*****@hg-public.languageforge.org/tpi"); Assert.AreEqual("joe", m.Username); }
public void PopulateAvailableProjects() { const string id1 = "nko"; const string id2 = "atinlay-dictionary"; const string id3 = "wra-ramo-dict"; const string json = @"[ { ""identifier"":""" + id1 + @""", ""name"":""Nkonya 2011"", ""repository"":""http:\/\/public.languageforge.org"", ""role"":""unknown"" }, { ""identifier"":""" + id2 + @""", ""name"":""Atinlay Dictionary"", ""repository"":""http:\/\/public.languageforge.org"", ""role"":""manager"" }, { ""identifier"":""" + id3 + @""", ""name"":""Ramo Dictionary"", ""repository"":""http:\/\/public.languageforge.org"", ""role"":""unknown"" }]" ; var m = new ServerSettingsModel(); // SUT m.PopulateAvailableProjects(json); Assert.AreEqual(3, m.AvailableProjects.Count, "number of available projects"); CollectionAssert.Contains(m.AvailableProjects, id1); CollectionAssert.Contains(m.AvailableProjects, id2); CollectionAssert.Contains(m.AvailableProjects, id3); }
public void SaveSettings_PreexistsAndWeSave_MovesCredentials([Values(true, false)] bool isResumable) { ServerSettingsModel.PasswordForSession = Settings.Default.LanguageForgePass = Settings.Default.LanguageForgeUser = null; using (var folder = new TemporaryFolder("ServerSettingsModel")) { const string user = "******"; const string pass = "******"; var subdomain = isResumable ? "resumable" : "hg-public"; var oldHost = $"{subdomain}.languagedepot.org/tpi"; var oldUrl = $"https://{user}:{pass}@{oldHost}"; const string newDomainAndProj = ".languageforge.org/tpi"; var newUrl = $"https://{subdomain}{newDomainAndProj}"; var newUrlWithCredentials = $"https://{user}:{pass}@{subdomain}{newDomainAndProj}"; // Precondition is some url that is not our default from the ServerSettingsModel var original = HgRepository.CreateOrUseExisting(folder.Path, new NullProgress()); original.SetKnownRepositoryAddresses(new[] { new HttpRepositoryPath("languageForge.org [legacy sync]", oldUrl, false) }); var m = new ServerSettingsModel(); m.InitFromProjectPath(folder.Path); m.SaveSettings(); Assert.AreEqual(user, Settings.Default.LanguageForgeUser); Assert.AreEqual(pass, ServerSettingsModel.DecryptPassword(Settings.Default.LanguageForgePass)); Assert.That(folder.Combine(".hg"), Does.Exist); Assert.That(folder.Combine(".hg", "hgrc"), Does.Exist); var repo = HgRepository.CreateOrUseExisting(folder.Path, new NullProgress()); var address = repo.GetDefaultNetworkAddress <HttpRepositoryPath>(); Assert.AreEqual(newUrl, address.URI); Assert.AreEqual(isResumable ? newUrl : newUrlWithCredentials, address.GetPotentialRepoUri(null, null, null), "The new 'potential' URI should contain credentials only when non-resumable"); } }
public void InitFromUri_FullTypicalLangForge_ProjectIdCorrect() { var m = new ServerSettingsModel(); m.InitFromUri("https://*****:*****@hg-public.languageforge.org/tpi"); Assert.AreEqual("tpi", m.ProjectId); }
public void InitFromUri_LANPathGiven_SelectedServerLabelIsCorrect() { var m = new ServerSettingsModel(); m.InitFromUri("\\mybox\tpi"); Assert.IsTrue(m.SelectedServerLabel.ToLower().Contains("custom")); }
public void InitFromUri_FullTypicalLangDepot_SelectedServerLabel() { var m = new ServerSettingsModel(); m.InitFromUri("http://*****:*****@hg-public.languagedepot.org/tpi"); Assert.AreEqual("languagedepot.org [safe mode]", m.SelectedServerLabel.ToLower()); }
public void PopulateAvailableProjects_ThrowsBadJson() { const string badJson = @"[{""identifier"":(}]"; var m = new ServerSettingsModel(); // SUT Assert.Throws <JsonReaderException>(() => m.PopulateAvailableProjects(badJson)); }
public void InitFromUri_ResumableLangForge_DomainAndBandwidthCorrectAndNotCustom() { var m = new ServerSettingsModel(); m.InitFromUri("https://resumable.languageforge.org/tpi"); Assert.AreEqual("resumable.languageforge.org", m.Host); Assert.AreEqual(ServerSettingsModel.BandwidthEnum.Low, m.Bandwidth.Value); Assert.False(m.IsCustomUrl); }
public void EncryptPassword_RoundTrips() { const string password = "******"; var encrypted = ServerSettingsModel.EncryptPassword(password); var decrypted = ServerSettingsModel.DecryptPassword(encrypted); Assert.AreEqual(password, decrypted); Assert.AreNotEqual(password, encrypted); }
public void InitFromUri_FullTypicalLangForge_ExistingProjectIdDisplayedOnLoad( [Values(true, false)] bool hasProjId) { const string proj = "tpi"; var m = new ServerSettingsModel(); m.InitFromUri($"https://*****:*****@hg-public.languageforge.org/{(hasProjId ? proj : string.Empty)}"); Assert.AreEqual(hasProjId, m.HasLoggedIn); }
public void InitFromUri_FullTypicalLangForge_DomainAndBandwidthCorrectAndNotCustom() { var m = new ServerSettingsModel(); m.InitFromUri("https://*****:*****@hg-public.languageforge.org/tpi"); Assert.AreEqual("hg-public.languageforge.org", m.Host); Assert.AreEqual(ServerSettingsModel.BandwidthEnum.High, m.Bandwidth.Value); Assert.False(m.IsCustomUrl); }
public void PopulateAvailableProjects_NoProjects([Values("", "[]")] string json) { var m = new ServerSettingsModel(); // SUT m.PopulateAvailableProjects(json); CollectionAssert.IsEmpty(m.AvailableProjects); }
public void GetIsReadyForInternetSendReceive_HasFullLangForgeUrlAndSavedCredentials_ReturnsTrue() { using (new MercurialIniForTests()) { Settings.Default.LanguageForgeUser = "******"; Settings.Default.LanguageForgePass = ServerSettingsModel.EncryptPassword("password"); ServerSettingsModel.PasswordForSession = null; Assert.IsTrue(GetIsReady(@"LanguageForge = https://hg-public.languageforge.org/xyz")); } }
private static void LaunchCustomUrl(string url) { var model = new ServerSettingsModel(); model.InitFromUri(url); using (var dlg = new ServerSettingsDialog(model)) { dlg.ShowDialog(); } }
public void InitFromUri_UsernameAndPass_OverwritesSettings() { Settings.Default.LanguageForgeUser = "******"; Settings.Default.LanguageForgePass = ServerSettingsModel.EncryptPassword("settings"); var m = new ServerSettingsModel(); m.InitFromUri("https://*****:*****@hg-public.languageforge.org/tps"); Assert.AreEqual("jan", m.Username); Assert.AreEqual("pass", m.Password); Assert.AreEqual("tps", m.ProjectId); }
private void LaunchCustomUrl(string url) { var model = new ServerSettingsModel(); model.InitFromUri(url); using (var dlg = new ServerSettingsDialog(model)) { if (DialogResult.OK != dlg.ShowDialog()) { return; } } }
public void DefaultUrlsAreIgnored() { using (var folder = new TemporaryFolder("ServerSettingsModel")) { var original = HgRepository.CreateOrUseExisting(folder.Path, new NullProgress()); original.SetKnownRepositoryAddresses(new[] { new HttpRepositoryPath("default", "c://abc.com", false) }); var m = new ServerSettingsModel(); const string url = "unclickable://hg-private.languageforge.org/tpi"; m.InitFromProjectPath(folder.Path); m.SetUrlToUseIfSettingsAreEmpty(url); Assert.AreEqual(url, m.URL); } }
public void InitFromUri_NoUsernameOrPass_UsesSettings() { const string user = "******"; const string pass = "******"; Settings.Default.LanguageForgeUser = user; Settings.Default.LanguageForgePass = ServerSettingsModel.EncryptPassword(pass); var m = new ServerSettingsModel(); m.InitFromUri("https://hg.languageforge.org/tpi"); Assert.AreEqual(user, m.Username); Assert.AreEqual(pass, m.Password); Assert.AreEqual("tpi", m.ProjectId); }
public void DefaultUrlsAreIgnored() { using (var folder = new TemporaryFolder("ServerSettingsModel")) { var original = HgRepository.CreateOrUseExisting(folder.Path, new NullProgress()); var existing = "c://abc.com"; original.SetKnownRepositoryAddresses(new[] { new HttpRepositoryPath("default", existing, false) }); var m = new ServerSettingsModel(); var url = "c://*****:*****@hg-public.languagedepot.org/tpi"; m.InitFromProjectPath(folder.Path); m.SetUrlToUseIfSettingsAreEmpty(url); Assert.AreEqual(url, m.URL); } }
public void SetUrlToUseIfSettingsAreEmpty_RepoAlreadyExistsWithAServerAddress_IgnoresOfferedUrl() { using (var folder = new TemporaryFolder("ServerSettingsModel")) { var original = HgRepository.CreateOrUseExisting(folder.Path, new NullProgress()); var existing = "https://abc.com"; original.SetKnownRepositoryAddresses(new[] { new HttpRepositoryPath("languageforge.org [Safe Mode]", existing, false) }); var m = new ServerSettingsModel(); var url = "https://*****:*****@hg-public.languageforge.org/tpi"; m.InitFromProjectPath(folder.Path); m.SetUrlToUseIfSettingsAreEmpty(url); Assert.AreEqual(existing, m.URL); } }
public void PopulateAvailableProjects_ToleratesMissingProperties() { const string id = "nko"; const string json = @"[{ ""identifier"":""" + id + @""" }]" ; var m = new ServerSettingsModel(); // SUT m.PopulateAvailableProjects(json); Assert.AreEqual(1, m.AvailableProjects.Count, "number of available projects"); CollectionAssert.Contains(m.AvailableProjects, id); }
public void RemovePasswordForLog_RemovesOnlyThePassword() { try { const string password = "******"; const string logFormat = "Cannot connect to https://someone:{0}@hg-public.languageforge.org/flex-proj; check your {1} and try again."; ServerSettingsModel.PasswordForSession = password; // SUT var scrubbed = ServerSettingsModel.RemovePasswordForLog(string.Format(logFormat, password, password)); Assert.AreEqual(string.Format(logFormat, ServerSettingsModel.PasswordAsterisks, password), scrubbed); } finally { ServerSettingsModel.PasswordForSession = null; } }
public void RemoveCredentialsFromIniIfNecessary_PreservesOtherData(string savedUser, string savedPass, string newSavedPass) { const string iniUsername = "******"; const string urlEnd = "hg-private.languageforge.org/auc-flex"; const string oldUrl = "https://" + "dinah:shibboleth@" + urlEnd; const string newUrl = "https://" + urlEnd; const string networkDirName = "Old Network Share"; const string networkDirRepo = "//chorus-box/projects/Wao"; Chorus.Properties.Settings.Default.LanguageForgeUser = savedUser; Chorus.Properties.Settings.Default.LanguageForgePass = ServerSettingsModel.EncryptPassword(savedPass); using (var tempDir = new TemporaryFolder("HgRepoURI")) { var repo = new HgRepository(tempDir.Path, _progress); var iniPath = repo.GetPathToHgrc(); Directory.CreateDirectory(Path.GetDirectoryName(iniPath)); var ini = repo.GetMercurialConfigForRepository(); ini.Sections.GetOrCreate("ui").Set("username", iniUsername); var paths = ini.Sections.GetOrCreate("paths"); paths.Set(networkDirName, networkDirRepo); paths.Set("LanguageForge", oldUrl); ini.Save(); // SUT repo.RemoveCredentialsFromIniIfNecessary(); ini = repo.GetMercurialConfigForRepository(); Assert.AreEqual(iniUsername, ini.Sections["ui"].GetValue("username"), "Other data should be preserved"); var newPaths = ini.Sections["paths"]; Assert.AreEqual(2, newPaths.ItemCount); Assert.AreEqual(networkDirRepo, newPaths.GetValue(networkDirName)); var actualUrl = newPaths.GetValue(newPaths.GetKeys().First(k => !k.Equals(networkDirName))); Assert.AreEqual(newUrl, actualUrl); Assert.AreEqual("dinah", Chorus.Properties.Settings.Default.LanguageForgeUser, "username is always saved"); Assert.AreEqual("shibboleth", ServerSettingsModel.PasswordForSession, "should have read password from file"); if (string.IsNullOrEmpty(newSavedPass)) { Assert.That(Chorus.Properties.Settings.Default.LanguageForgePass, Is.Null.Or.Empty); } else { Assert.That(ServerSettingsModel.DecryptPassword(Chorus.Properties.Settings.Default.LanguageForgePass), Is.EqualTo(newSavedPass), "should have saved the password to user settings"); } } }
public void InitFromUri_CredentialsOriginallySetFromModelWithSpecialCharacters_AbleToRoundTripCredentialsBackFromURIOK() { var model = new ServerSettingsModel(); const string accountName = "*****@*****.**"; const string password = "******"; const string projectId = "projectId"; model.AccountName = accountName; model.Password = password; model.ProjectId = projectId; var urlWithEncodedChars = model.URL; var newModel = new ServerSettingsModel(); newModel.InitFromUri(urlWithEncodedChars); Assert.AreEqual(accountName, newModel.AccountName); Assert.AreEqual(password, newModel.Password); Assert.AreEqual(projectId, newModel.ProjectId); }
public void InitFromUri_FullTypicalLangDepot_AccountNameCorrect() { var m = new ServerSettingsModel(); m.InitFromUri("http://*****:*****@hg-public.languagedepot.org/tpi"); Assert.AreEqual("joe",m.AccountName); }
public void DefaultIsResumable() { var m = new ServerSettingsModel(); Assert.AreEqual("resumable.languagedepot.org", m.Servers[m.SelectedServerLabel]); }
public void SaveSettings_PrexistsButWeChangePasswordAndSave_ChangesPassword() { using (var folder = new TemporaryFolder("ServerSettingsModel")) { // Precondition is some url that is not our default from the ServerSettingsModel var original = HgRepository.CreateOrUseExisting(folder.Path, new NullProgress()); original.SetKnownRepositoryAddresses(new[] { new HttpRepositoryPath("languagedepot.org [legacy sync]", "http://*****:*****@hg-public.languagedepot.org/tpi", false) }); var m = new ServerSettingsModel(); m.InitFromProjectPath(folder.Path); m.Password = "******"; m.SaveSettings(); Assert.IsTrue(Directory.Exists(folder.Combine(".hg"))); Assert.IsTrue(File.Exists(folder.Combine(".hg", "hgrc"))); var repo = HgRepository.CreateOrUseExisting(folder.Path, new NullProgress()); var address = repo.GetDefaultNetworkAddress<HttpRepositoryPath>(); Assert.AreEqual("http://*****:*****@hg-public.languagedepot.org/tpi", address.URI); Assert.AreEqual("newPassword", address.Password); } }
public void SaveSettings_NoHgFolderExists_CreatesOneWithCorrectPath() { using (var folder = new TemporaryFolder("ServerSettingsModel")) { var m = new ServerSettingsModel(); var url = "http://*****:*****@hg-public.languagedepot.org/tpi"; m.InitFromProjectPath(folder.Path); m.SetUrlToUseIfSettingsAreEmpty(url); m.SaveSettings(); Assert.IsTrue(Directory.Exists(folder.Combine(".hg"))); Assert.IsTrue(File.Exists(folder.Combine(".hg","hgrc"))); var repo = HgRepository.CreateOrUseExisting(folder.Path, new NullProgress()); var address = repo.GetDefaultNetworkAddress<HttpRepositoryPath>(); Assert.AreEqual("languageDepot.org[safemode]".ToLower(), address.Name.ToLower()); Assert.AreEqual(url, address.URI); } }
public void InitFromUri_HasFolderDesignator_IdIsCorrect() { var m = new ServerSettingsModel(); m.InitFromUri("http://*****:*****@hg-public.languagedepot.org/tpi?localFolder=foo"); Assert.AreEqual("tpi", m.ProjectId); }
public void InitFromUri_UnknownHttpGiven_CustomUrlIsTrue() { var m = new ServerSettingsModel(); m.InitFromUri("http://somewhereelse.net/xyz"); Assert.IsTrue(m.CustomUrlSelected); }
public void InitFromUri_LANPathGiven_CustomUrlIsTrue() { var m = new ServerSettingsModel(); m.InitFromUri("\\mybox\tpi"); Assert.IsTrue(m.CustomUrlSelected); }