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());
        }
Exemplo n.º 5
0
        public void InitFromUri_HasFolderDesignator_IdIsCorrect()
        {
            var m = new ServerSettingsModel();

            m.InitFromUri("https://*****:*****@hg-public.languageforge.org/tpi?localFolder=foo");
            Assert.AreEqual("tpi", m.ProjectId);
        }
Exemplo n.º 6
0
        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;
            }
        }
Exemplo n.º 7
0
        public void InitFromUri_LANPathGiven_CustomUrlIsTrue()
        {
            var m = new ServerSettingsModel();

            m.InitFromUri("\\mybox\tpi");
            Assert.IsTrue(m.IsCustomUrl);
        }
Exemplo n.º 8
0
        public void InitFromUri_UnknownHttpGiven_CustomUrlIsTrue()
        {
            var m = new ServerSettingsModel();

            m.InitFromUri("https://somewhereelse.net/xyz");
            Assert.IsTrue(m.IsCustomUrl);
        }
Exemplo n.º 9
0
        public void InitFromUri_FullTypicalLangForge_AccountNameCorrect()
        {
            var m = new ServerSettingsModel();

            m.InitFromUri("https://*****:*****@hg-public.languageforge.org/tpi");
            Assert.AreEqual("joe", m.Username);
        }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
        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");
            }
        }
Exemplo n.º 12
0
        public void InitFromUri_FullTypicalLangForge_ProjectIdCorrect()
        {
            var m = new ServerSettingsModel();

            m.InitFromUri("https://*****:*****@hg-public.languageforge.org/tpi");
            Assert.AreEqual("tpi", m.ProjectId);
        }
Exemplo n.º 13
0
        public void InitFromUri_LANPathGiven_SelectedServerLabelIsCorrect()
        {
            var m = new ServerSettingsModel();

            m.InitFromUri("\\mybox\tpi");
            Assert.IsTrue(m.SelectedServerLabel.ToLower().Contains("custom"));
        }
Exemplo n.º 14
0
        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());
        }
Exemplo n.º 15
0
        public void PopulateAvailableProjects_ThrowsBadJson()
        {
            const string badJson = @"[{""identifier"":(}]";
            var          m       = new ServerSettingsModel();

            // SUT
            Assert.Throws <JsonReaderException>(() => m.PopulateAvailableProjects(badJson));
        }
Exemplo n.º 16
0
        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);
        }
Exemplo n.º 17
0
        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);
        }
Exemplo n.º 18
0
        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);
        }
Exemplo n.º 19
0
        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);
        }
Exemplo n.º 20
0
        public void PopulateAvailableProjects_NoProjects([Values("", "[]")] string json)
        {
            var m = new ServerSettingsModel();

            // SUT
            m.PopulateAvailableProjects(json);

            CollectionAssert.IsEmpty(m.AvailableProjects);
        }
Exemplo n.º 21
0
 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"));
     }
 }
Exemplo n.º 22
0
        private static void LaunchCustomUrl(string url)
        {
            var model = new ServerSettingsModel();

            model.InitFromUri(url);
            using (var dlg = new ServerSettingsDialog(model))
            {
                dlg.ShowDialog();
            }
        }
Exemplo n.º 23
0
        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);
        }
Exemplo n.º 24
0
        private void LaunchCustomUrl(string url)
        {
            var model = new ServerSettingsModel();

            model.InitFromUri(url);
            using (var dlg = new ServerSettingsDialog(model))
            {
                if (DialogResult.OK != dlg.ShowDialog())
                {
                    return;
                }
            }
        }
Exemplo n.º 25
0
        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);
            }
        }
Exemplo n.º 26
0
        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);
        }
Exemplo n.º 27
0
        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);
            }
        }
Exemplo n.º 28
0
        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);
            }
        }
Exemplo n.º 29
0
        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);
        }
Exemplo n.º 30
0
 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;
     }
 }
Exemplo n.º 31
0
        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");
                }
            }
        }
Exemplo n.º 32
0
        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);
        }
Exemplo n.º 33
0
 public void InitFromUri_FullTypicalLangDepot_CustomUrlFalse()
 {
     var m = new ServerSettingsModel();
     m.InitFromUri("http://*****:*****@hg-public.languagedepot.org/tpi");
     Assert.IsFalse(m.CustomUrlSelected);
 }
Exemplo n.º 34
0
 public void InitFromUri_FullTypicalLangDepot_PasswordCorrect()
 {
     var m = new ServerSettingsModel();
     m.InitFromUri("http://*****:*****@hg-public.languagedepot.org/tpi");
     Assert.AreEqual("pass", m.Password);
 }
Exemplo n.º 35
0
 public void InitFromUri_FullTypicalLangDepot_AccountNameCorrect()
 {
     var m = new ServerSettingsModel();
     m.InitFromUri("http://*****:*****@hg-public.languagedepot.org/tpi");
     Assert.AreEqual("joe",m.AccountName);
 }
Exemplo n.º 36
0
 public void DefaultIsResumable()
 {
     var m = new ServerSettingsModel();
     Assert.AreEqual("resumable.languagedepot.org", m.Servers[m.SelectedServerLabel]);
 }
Exemplo n.º 37
0
        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);
            }
        }
Exemplo n.º 38
0
 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());
 }
Exemplo n.º 39
0
 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());
 }
Exemplo n.º 40
0
 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);
     }
 }
Exemplo n.º 41
0
 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);
 }
Exemplo n.º 42
0
 public void InitFromUri_HasFolderDesignator_IdIsCorrect()
 {
     var m = new ServerSettingsModel();
     m.InitFromUri("http://*****:*****@hg-public.languagedepot.org/tpi?localFolder=foo");
     Assert.AreEqual("tpi", m.ProjectId);
 }
Exemplo n.º 43
0
 public void InitFromUri_UnknownHttpGiven_CustomUrlIsTrue()
 {
     var m = new ServerSettingsModel();
     m.InitFromUri("http://somewhereelse.net/xyz");
     Assert.IsTrue(m.CustomUrlSelected);
 }
Exemplo n.º 44
0
 public void InitFromUri_LANPathGiven_SelectedServerLabelIsCorrect()
 {
     var m = new ServerSettingsModel();
     m.InitFromUri("\\mybox\tpi");
     Assert.IsTrue(m.SelectedServerLabel.ToLower().Contains("custom"));
 }
Exemplo n.º 45
0
 public void InitFromUri_LANPathGiven_CustomUrlIsTrue()
 {
     var m = new ServerSettingsModel();
     m.InitFromUri("\\mybox\tpi");
     Assert.IsTrue(m.CustomUrlSelected);
 }