From a07cb6fd3e9ff6b679003a26f1423a5f50cac3ab Mon Sep 17 00:00:00 2001 From: Michael Gordeev Date: Mon, 20 Apr 2020 17:51:42 +0300 Subject: [PATCH] Parser improvements and fixes, Tests (#23) * Added unit tests, fixed and improved parser * Updated translation files * Updated unit tests to work with credentials * Updated validation CI config * Updated changelogs, improved CI/CD processes --- .../Resources/Resource.designer.cs | 2 +- .../Resources/values-ru/strings.xml | 4 +- .../Resources/values/strings.xml | 6 +- .../AnonymousScheduleUnitTest.cs | 96 +++++++++++++++++++ .../CabinetScheduleUnitTest.cs | 40 ++++++++ .../GUTSchedule.Test/GUTSchedule.Test.csproj | 28 ++++++ .../GUTSchedule.Test/TestCredential.json | 4 + .../GUTSchedule.UWP/Strings/en/Resources.resw | 6 +- .../GUTSchedule.UWP/Strings/ru/Resources.resw | 4 +- GUT.Schedule/GUTSchedule.sln | 32 +++++++ GUT.Schedule/GUTSchedule/Parser.cs | 32 ++++--- changelogs/android.xml | 3 - .../en/baseListing/releaseNotes.txt | 2 +- .../en/changelogs/android-changelog.txt | 1 + .../ru/baseListing/releaseNotes.txt | 2 +- .../ru/changelogs/android-changelog.txt | 1 + changelogs/github.md | 2 +- pipelines/android-release.yml | 11 ++- pipelines/validation.yml | 24 ++++- pipelines/windows-release.yml | 3 +- 20 files changed, 267 insertions(+), 36 deletions(-) create mode 100644 GUT.Schedule/GUTSchedule.Test/AnonymousScheduleUnitTest.cs create mode 100644 GUT.Schedule/GUTSchedule.Test/CabinetScheduleUnitTest.cs create mode 100644 GUT.Schedule/GUTSchedule.Test/GUTSchedule.Test.csproj create mode 100644 GUT.Schedule/GUTSchedule.Test/TestCredential.json delete mode 100644 changelogs/android.xml create mode 100644 changelogs/appMetadata/en/changelogs/android-changelog.txt create mode 100644 changelogs/appMetadata/ru/changelogs/android-changelog.txt diff --git a/GUT.Schedule/GUTSchedule.Droid/Resources/Resource.designer.cs b/GUT.Schedule/GUTSchedule.Droid/Resources/Resource.designer.cs index 8f3d861..fce2a8c 100644 --- a/GUT.Schedule/GUTSchedule.Droid/Resources/Resource.designer.cs +++ b/GUT.Schedule/GUTSchedule.Droid/Resources/Resource.designer.cs @@ -15,7 +15,7 @@ namespace GUTSchedule.Droid { - [System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")] public partial class Resource { diff --git a/GUT.Schedule/GUTSchedule.Droid/Resources/values-ru/strings.xml b/GUT.Schedule/GUTSchedule.Droid/Resources/values-ru/strings.xml index d617661..a62db0a 100644 --- a/GUT.Schedule/GUTSchedule.Droid/Resources/values-ru/strings.xml +++ b/GUT.Schedule/GUTSchedule.Droid/Resources/values-ru/strings.xml @@ -51,7 +51,7 @@ Добавить расписание - ©2020 Михаил Гордеев, ИКСС, ИКТ-907 + ©2020 Михаил Гордеев, ИСиТ, ИСТ-942 Очистить расписание Сообщить об ошибке @@ -81,7 +81,7 @@ О приложении Приложение для экспорта перподавательского и учебного расписаний Санкт-Петербургского Государственного Университета Телекоммуникаций им. проф. М.А. Бонч-Бруевича - Разработано Михаилом Гордеевым, ИКТ-907, ИКСС в Научно-образовательном центре \"Технологии информационных образовательных систем\" + Разработано Михаилом Гордеевым, ИСТ-942, ИСиТ в Научно-образовательном центре \"Технологии информационных образовательных систем\" Свой вклад в разработку внесли Особые благодарности diff --git a/GUT.Schedule/GUTSchedule.Droid/Resources/values/strings.xml b/GUT.Schedule/GUTSchedule.Droid/Resources/values/strings.xml index 559620c..d6a6cf5 100644 --- a/GUT.Schedule/GUTSchedule.Droid/Resources/values/strings.xml +++ b/GUT.Schedule/GUTSchedule.Droid/Resources/values/strings.xml @@ -50,7 +50,7 @@ Add schedule - ©2020 Michael Gordeev, INS, ICT-907 + ©2020 Michael Gordeev, IST, IST-942 Clear schedule Report error @@ -79,7 +79,7 @@ About application Application for SPbSUT professors\' and students\' schedule export - Developed by Michael Gordeev (ICT-907, INS) in the \"Technologies of Informational and Educational Systems\" Research Facility + Developed by Michael Gordeev (IST-942, IST) in the \"Technologies of Informational and Educational Systems\" Research and Educational Center Contributors Special thanks @@ -93,7 +93,7 @@ Useful links Privacy policy GitHub Repository - \"TIES\" RF + \"TIES\" REC SPbSUT Leave feedback diff --git a/GUT.Schedule/GUTSchedule.Test/AnonymousScheduleUnitTest.cs b/GUT.Schedule/GUTSchedule.Test/AnonymousScheduleUnitTest.cs new file mode 100644 index 0000000..93b81f8 --- /dev/null +++ b/GUT.Schedule/GUTSchedule.Test/AnonymousScheduleUnitTest.cs @@ -0,0 +1,96 @@ +using System; +using System.Threading.Tasks; +using GUTSchedule.Models; +using NUnit.Framework; + +namespace GUTSchedule.Test +{ + public class AnonymousScheduleUnitTest + { + [Test] + public async Task FacultiesListTest() + { + var list = await Parser.GetFaculties(); + Assert.IsNotNull(list); + Assert.IsTrue(list.Count > 0); + + Console.WriteLine("Faculties list:"); + list.ForEach(i => + Console.WriteLine($"{i.name} ({i.id})")); + } + + [Test] + public async Task GroupListTest() + { + var faculties = await Parser.GetFaculties(); + if (faculties == null || faculties.Count < 1) + { + Assert.Warn("No faculties found"); + return; + } + + var (id, name) = faculties[new Random().Next(0, faculties.Count)]; + Console.WriteLine($"Randomly selected faculty: {name} ({id})"); + + var list = await Parser.GetGroups(id); + Assert.IsNotNull(list); + Assert.IsTrue(list.Count > 0); + + Console.WriteLine("Groups list:"); + list.ForEach(i => + Console.WriteLine($"{i.name} ({i.id})")); + } + + [Test] + public async Task ScheduleListTest() + { + var faculties = await Parser.GetFaculties(); + if (faculties == null || faculties.Count < 1) + { + Assert.Warn("No faculties found"); + return; + } + var faculty = faculties[new Random().Next(0, faculties.Count)]; + Console.WriteLine($"Randomly selected faculty: {faculty.name} ({faculty.id})"); + + var groups = await Parser.GetGroups(faculty.id); + if (groups == null || groups.Count < 1) + { + Assert.Warn("No groups found"); + return; + } + var group = groups[new Random().Next(0, groups.Count)]; + Console.WriteLine($"Randomly selected group: {group.name} ({group.id})"); + + try + { + var list = await Parser.GetSchedule(new DefaultExportParameters + { + Course = "0", + FacultyId = faculty.id, + GroupId = group.id, + EndDate = DateTime.Today.AddDays(7), + StartDate = DateTime.Today + }); + + Assert.IsNotNull(list); + Assert.IsTrue(list.Count > 0); + + Console.WriteLine("Events list:"); + foreach (var i in list) + { + Console.WriteLine("--------------------------------------------------"); + Console.WriteLine($"[{i.Group}] {i.Order}. {i.Name} ({i.Type})"); + Console.WriteLine(i.Cabinet); + Console.WriteLine(i.StartTime.ToShortDateString()); + Console.WriteLine($"{i.StartTime.ToShortTimeString()}-{i.EndTime.ToShortTimeString()}"); + Console.WriteLine(i.Opponent); + } + } + catch (NullReferenceException e) + { + Assert.Warn(e.Message); + } + } + } +} \ No newline at end of file diff --git a/GUT.Schedule/GUTSchedule.Test/CabinetScheduleUnitTest.cs b/GUT.Schedule/GUTSchedule.Test/CabinetScheduleUnitTest.cs new file mode 100644 index 0000000..d38022c --- /dev/null +++ b/GUT.Schedule/GUTSchedule.Test/CabinetScheduleUnitTest.cs @@ -0,0 +1,40 @@ +using NUnit.Framework; +using System.Threading.Tasks; +using GUTSchedule.Models; +using System; +using Newtonsoft.Json; +using System.IO; + +namespace GUTSchedule.Test +{ + public class CabinetScheduleUnitTest + { + [Test] + public async Task ScheduleListTest() + { + dynamic secrets = JsonConvert.DeserializeObject(File.ReadAllText(Directory.GetCurrentDirectory() + "\\TestCredential.json")); + var list = await Parser.GetSchedule(new CabinetExportParameters + { + Email = secrets.testEmail, + Password = secrets.testPassword, + EndDate = DateTime.Today.AddDays(7), + StartDate = DateTime.Today + }); + + Assert.IsNotNull(list); + Assert.IsTrue(list.Count > 0); + + + Console.WriteLine("Events list:"); + foreach (var i in list) + { + Console.WriteLine("--------------------------------------------------"); + Console.WriteLine($"[{i.Group}] {i.Order}. {i.Name} ({i.Type})"); + Console.WriteLine(i.Cabinet); + Console.WriteLine(i.StartTime.ToShortDateString()); + Console.WriteLine($"{i.StartTime.ToShortTimeString()}-{i.EndTime.ToShortTimeString()}"); + Console.WriteLine(i.Opponent); + } + } + } +} \ No newline at end of file diff --git a/GUT.Schedule/GUTSchedule.Test/GUTSchedule.Test.csproj b/GUT.Schedule/GUTSchedule.Test/GUTSchedule.Test.csproj new file mode 100644 index 0000000..54410f2 --- /dev/null +++ b/GUT.Schedule/GUTSchedule.Test/GUTSchedule.Test.csproj @@ -0,0 +1,28 @@ + + + + netcoreapp3.1 + + false + + f8ba6b25-bdcb-442c-98aa-3bcf31300ad0 + + + + + + + + + + + + + + + + PreserveNewest + + + + diff --git a/GUT.Schedule/GUTSchedule.Test/TestCredential.json b/GUT.Schedule/GUTSchedule.Test/TestCredential.json new file mode 100644 index 0000000..ec44eb0 --- /dev/null +++ b/GUT.Schedule/GUTSchedule.Test/TestCredential.json @@ -0,0 +1,4 @@ +{ + "testEmail": "%EMAIL%", + "testPassword": "%PASSWORD%" +} \ No newline at end of file diff --git a/GUT.Schedule/GUTSchedule.UWP/Strings/en/Resources.resw b/GUT.Schedule/GUTSchedule.UWP/Strings/en/Resources.resw index 1267e8e..16bae3d 100644 --- a/GUT.Schedule/GUTSchedule.UWP/Strings/en/Resources.resw +++ b/GUT.Schedule/GUTSchedule.UWP/Strings/en/Resources.resw @@ -187,7 +187,7 @@ Contributors - ©2020 Michael Gordeev, INS, ICT-907 + ©2020 Michael Gordeev, IST, IST-942 Course @@ -208,7 +208,7 @@ Destination calendar - Developed by Michael Gordeev (ICT-907, INS) in the "Technologies of Informational and Educational Systems" Research Facility + Developed by Michael Gordeev (IST-942, IST) in the "Technologies of Informational and Educational Systems" Research and Educational Center Done @@ -274,7 +274,7 @@ None - "TIES" RF + "TIES" REC Password diff --git a/GUT.Schedule/GUTSchedule.UWP/Strings/ru/Resources.resw b/GUT.Schedule/GUTSchedule.UWP/Strings/ru/Resources.resw index 7e976d4..c5b327a 100644 --- a/GUT.Schedule/GUTSchedule.UWP/Strings/ru/Resources.resw +++ b/GUT.Schedule/GUTSchedule.UWP/Strings/ru/Resources.resw @@ -187,7 +187,7 @@ Свой вклад в разработку внесли - ©2020 Михаил Гордеев, ИКСС, ИКТ-907 + ©2020 Михаил Гордеев, ИСиТ, ИСТ-942 Курс @@ -208,7 +208,7 @@ Конечный календарь - Разработано Михаилом Гордеевым, ИКТ-907, ИКСС в Научно-образовательном центре "Технологии информационных образовательных систем" + Разработано Михаилом Гордеевым, ИСТ-942, ИСиТ в Научно-образовательном центре "Технологии информационных образовательных систем" Готово diff --git a/GUT.Schedule/GUTSchedule.sln b/GUT.Schedule/GUTSchedule.sln index beff3d0..e3cae2b 100644 --- a/GUT.Schedule/GUTSchedule.sln +++ b/GUT.Schedule/GUTSchedule.sln @@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GUTSchedule.UWP", "GUTSched EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GUTSchedule", "GUTSchedule\GUTSchedule.csproj", "{A6F6DE35-0EB4-4D11-9FF9-F4601595B639}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GUTSchedule.Test", "GUTSchedule.Test\GUTSchedule.Test.csproj", "{B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -146,6 +148,36 @@ Global {A6F6DE35-0EB4-4D11-9FF9-F4601595B639}.Release|x64.Build.0 = Release|Any CPU {A6F6DE35-0EB4-4D11-9FF9-F4601595B639}.Release|x86.ActiveCfg = Release|Any CPU {A6F6DE35-0EB4-4D11-9FF9-F4601595B639}.Release|x86.Build.0 = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Debug|ARM.ActiveCfg = Debug|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Debug|ARM.Build.0 = Debug|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Debug|ARM64.Build.0 = Debug|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Debug|x64.ActiveCfg = Debug|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Debug|x64.Build.0 = Debug|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Debug|x86.ActiveCfg = Debug|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Debug|x86.Build.0 = Debug|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release (APK)|Any CPU.ActiveCfg = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release (APK)|Any CPU.Build.0 = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release (APK)|ARM.ActiveCfg = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release (APK)|ARM.Build.0 = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release (APK)|ARM64.ActiveCfg = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release (APK)|ARM64.Build.0 = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release (APK)|x64.ActiveCfg = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release (APK)|x64.Build.0 = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release (APK)|x86.ActiveCfg = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release (APK)|x86.Build.0 = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release|Any CPU.Build.0 = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release|ARM.ActiveCfg = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release|ARM.Build.0 = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release|ARM64.ActiveCfg = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release|ARM64.Build.0 = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release|x64.ActiveCfg = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release|x64.Build.0 = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release|x86.ActiveCfg = Release|Any CPU + {B5DD5664-E1B4-4F48-B0CD-C0A126C7E58D}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/GUT.Schedule/GUTSchedule/Parser.cs b/GUT.Schedule/GUTSchedule/Parser.cs index 1e8805e..6869e8c 100644 --- a/GUT.Schedule/GUTSchedule/Parser.cs +++ b/GUT.Schedule/GUTSchedule/Parser.cs @@ -25,7 +25,7 @@ namespace GUTSchedule await client.GetAsync("https://cabs.itut.ru/cabinet/"); - HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "https://cabs.itut.ru/cabinet/lib/autentificationok.php"); + HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "https://lk.sut.ru/cabinet/lib/autentificationok.php"); request.SetContent( ("users", email), ("parole", password)); @@ -39,8 +39,9 @@ namespace GUTSchedule if (!responseContent.StartsWith("1", StringComparison.OrdinalIgnoreCase)) { Dictionary responseQuery = new Dictionary(); - foreach (string i in responseContent.Split('&')) - responseQuery.Add(i.Split('=')[0], i.Split('=')[1]); + if (responseContent.Length > 1) + foreach (string i in responseContent.Split('&')) + responseQuery.Add(i.Split('=')[0], i.Split('=')[1]); throw new System.Security.VerificationException(responseQuery["error"].Replace("|", "; ")); } @@ -85,7 +86,7 @@ namespace GUTSchedule schedule[k - 1].Name == schedule[k].Name && schedule[k - 1].Type == schedule[k].Type) { - schedule[k - 1].Opponent += $" ({schedule[k-1].Cabinet}) \n {schedule[k].Opponent} ({schedule[k].Cabinet})"; + schedule[k - 1].Opponent += $" ({schedule[k-1].Cabinet}) \n{schedule[k].Opponent} ({schedule[k].Cabinet})"; schedule[k - 1].Cabinet += "; " + schedule[k].Cabinet; schedule.RemoveAt(k--); } @@ -229,11 +230,11 @@ namespace GUTSchedule int order = int.Parse(item.GetAttribute("pair")) - 1; Occupation occupation = new Occupation { - Name = item.QuerySelector(".subect").TextContent, + Name = item.QuerySelector(".subect").TextContent.Replace(" (1)", "").Replace(" (2)", ""), Type = item.QuerySelector(".type").TextContent.Replace("(", "").Replace(")", ""), Group = groupName, - Opponent = item.QuerySelector(".teacher")?.GetAttribute("title").Replace("; ", "\n") ?? "", - Cabinet = item.QuerySelector(".aud")?.TextContent.Replace("ауд.: ", "").Replace("; Б22", "") ?? "СПбГУТ", + Opponent = item.QuerySelector(".teacher")?.GetAttribute("title").Replace("; ", "") ?? "", + Cabinet = item.QuerySelector(".aud")?.TextContent.Replace("ауд.: ", "").Replace("; Б22", "").Replace(" ", "") ?? "СПбГУТ", Order = order > 50 ? $"Ф{order - 81}" : order.ToString() }; @@ -309,10 +310,17 @@ namespace GUTSchedule DateTime date = DateTime.Parse(item.FirstChild.FirstChild.TextContent, new CultureInfo("ru-RU")); string rawTime = item.ChildNodes[2].TextContent; - rawTime = rawTime.Substring(rawTime.IndexOf('(')).Replace(")", "").Replace('.', ':'); - - occupation.StartTime = date.Add(TimeSpan.Parse(rawTime.Split('-')[0])); - occupation.EndTime = date.Add(TimeSpan.Parse(rawTime.Split('-')[1])); + try + { + rawTime = rawTime.Substring(rawTime.IndexOf('(')).Replace(")", "").Replace('.', ':'); + occupation.StartTime = date.Add(TimeSpan.Parse(rawTime.Split('-')[0])); + occupation.EndTime = date.Add(TimeSpan.Parse(rawTime.Split('-')[1])); + } + catch + { + occupation.StartTime = date; + occupation.EndTime = date; + } schedule.Add(occupation); } @@ -355,7 +363,7 @@ namespace GUTSchedule item.Opponent = i.QuerySelectorAll("i")[k].NextSibling.NextSibling.NextSibling?.NodeType == NodeType.Text ? i.QuerySelectorAll("i")[k].NextSibling.NextSibling.NextSibling.TextContent : ""; - try { item.Cabinet = i.QuerySelectorAll("small")[k].NextSibling.TextContent.Replace("; Б22", ""); } + try { item.Cabinet = i.QuerySelectorAll("small")[k].NextSibling.TextContent.Replace(" ", "").Replace(";Б22", ""); } catch { item.Cabinet = "СПбГУТ"; } string rawTime = i.QuerySelectorAll("b")[k * 2 + 2].TextContent; diff --git a/changelogs/android.xml b/changelogs/android.xml deleted file mode 100644 index 06817cf..0000000 --- a/changelogs/android.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - Исправлена проблема с экспортом расписания без авторизации - \ No newline at end of file diff --git a/changelogs/appMetadata/en/baseListing/releaseNotes.txt b/changelogs/appMetadata/en/baseListing/releaseNotes.txt index 1d42810..6e27aa7 100644 --- a/changelogs/appMetadata/en/baseListing/releaseNotes.txt +++ b/changelogs/appMetadata/en/baseListing/releaseNotes.txt @@ -1 +1 @@ -- Fixed anonymous schedule loading \ No newline at end of file +- Fixed and improved parser \ No newline at end of file diff --git a/changelogs/appMetadata/en/changelogs/android-changelog.txt b/changelogs/appMetadata/en/changelogs/android-changelog.txt new file mode 100644 index 0000000..6e27aa7 --- /dev/null +++ b/changelogs/appMetadata/en/changelogs/android-changelog.txt @@ -0,0 +1 @@ +- Fixed and improved parser \ No newline at end of file diff --git a/changelogs/appMetadata/ru/baseListing/releaseNotes.txt b/changelogs/appMetadata/ru/baseListing/releaseNotes.txt index edb8530..36566e0 100644 --- a/changelogs/appMetadata/ru/baseListing/releaseNotes.txt +++ b/changelogs/appMetadata/ru/baseListing/releaseNotes.txt @@ -1 +1 @@ -- Исправлена проблема с экспортом расписания без авторизации \ No newline at end of file +- Исправлен и улучшен парсер расписания \ No newline at end of file diff --git a/changelogs/appMetadata/ru/changelogs/android-changelog.txt b/changelogs/appMetadata/ru/changelogs/android-changelog.txt new file mode 100644 index 0000000..36566e0 --- /dev/null +++ b/changelogs/appMetadata/ru/changelogs/android-changelog.txt @@ -0,0 +1 @@ +- Исправлен и улучшен парсер расписания \ No newline at end of file diff --git a/changelogs/github.md b/changelogs/github.md index 9d68c23..872ef90 100644 --- a/changelogs/github.md +++ b/changelogs/github.md @@ -1,2 +1,2 @@ ## Core -- Fixed anonymous schedule loading \ No newline at end of file +- Fixed and improved parser \ No newline at end of file diff --git a/pipelines/android-release.yml b/pipelines/android-release.yml index c17fc08..cb32e5f 100644 --- a/pipelines/android-release.yml +++ b/pipelines/android-release.yml @@ -8,7 +8,8 @@ trigger: exclude: - '*' include: - - changelogs/android.xml + - changelogs/appMetadata/en/changelogs/* + - changelogs/appMetadata/ru/changelogs/* pool: vmImage: 'windows-latest' @@ -33,6 +34,8 @@ steps: script: | (Get-Content AndroidManifest.xml -encoding UTF8 | Out-String) -replace '(?<=\bandroid:versionCode=")[^"]*', $(Build.BuildId) | set-content AndroidManifest.xml -encoding UTF8 (Get-Content AndroidManifest.xml -encoding UTF8 | Out-String) -replace '(?<=\bandroid:versionName=")[^"]*', $(Build.BuildNumber) | set-content AndroidManifest.xml -encoding UTF8 + Rename-Item '$(Build.SourcesDirectory)/changelogs/appMetadata/en/changelogs/android-changelog.txt' '$(Build.BuildId).txt' + Rename-Item '$(Build.SourcesDirectory)/changelogs/appMetadata/ru/changelogs/android-changelog.txt' '$(Build.BuildId).txt' workingDirectory: '$(Build.SourcesDirectory)\GUT.Schedule\GUTSchedule.Droid\Properties' - task: XamarinAndroid@1 @@ -68,10 +71,8 @@ steps: displayName: 'Copy changelog to output' inputs: SourceFolder: '$(Build.SourcesDirectory)/changelogs' - Contents: | - android.xml - github.md - TargetFolder: '$(outputDirectory)' + Contents: '**' + TargetFolder: '$(Build.ArtifactStagingDirectory)/changelogs' - task: PowerShell@2 displayName: 'Update package name' diff --git a/pipelines/validation.yml b/pipelines/validation.yml index a310a64..cb7ec7a 100644 --- a/pipelines/validation.yml +++ b/pipelines/validation.yml @@ -43,4 +43,26 @@ steps: platform: 'x64' solution: '**/**.UWP.csproj' configuration: '$(buildConfiguration)' - msbuildArgs: '/p:AppxPackageSigningEnabled=false' \ No newline at end of file + msbuildArgs: '/p:AppxPackageSigningEnabled=false' + +- task: FileTransform@2 + displayName: 'Update test credential' + inputs: + folderPath: '$(System.DefaultWorkingDirectory)' + xmlTransformationRules: + jsonTargetFiles: '**/TestCredential.json' + +- task: VSBuild@1 + displayName: 'Build Tests' + inputs: + solution: '**\*.Test.csproj' + +- task: VSTest@2 + displayName: 'Run Tests' + inputs: + testSelector: 'testAssemblies' + testAssemblyVer2: | + **\*.Test.dll + !**\*TestAdapter.dll + !**\obj\** + searchFolder: '$(System.DefaultWorkingDirectory)' \ No newline at end of file diff --git a/pipelines/windows-release.yml b/pipelines/windows-release.yml index 95558da..7e956ee 100644 --- a/pipelines/windows-release.yml +++ b/pipelines/windows-release.yml @@ -8,7 +8,8 @@ trigger: exclude: - '*' include: - - changelogs/appMetadata/* + - changelogs/appMetadata/en/baseListing/* + - changelogs/appMetadata/ru/baseListing/* pool: vmImage: 'windows-latest'