diff --git a/TeamCitySharp.sln b/TeamCitySharp.sln index 7612bf16..be13a99d 100644 --- a/TeamCitySharp.sln +++ b/TeamCitySharp.sln @@ -7,15 +7,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{263F35DD EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TeamCitySharp.IntegrationTests", "src\Tests\IntegrationTests\TeamCitySharp.IntegrationTests.csproj", "{BA409A09-CC7B-4A71-A3D4-FE27234A721B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TeamCitySharp.UnitTests", "src\Tests\UnitTests\TeamCitySharp.UnitTests.csproj", "{1DA175C4-2A6F-4B52-A9B4-87D382150AE9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TeamCitySharp", "src\TeamCitySharp\TeamCitySharp.csproj", "{419C8D24-ED8A-47BE-87BB-8790534FEF09}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamCitySharp", "src\TeamCitySharp\TeamCitySharp.csproj", "{419C8D24-ED8A-47BE-87BB-8790534FEF09}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Documentation", "Documentation", "{E947C127-1479-451D-994A-0E6935999466}" ProjectSection(SolutionItems) = preProject README.md = README.md EndProjectSection EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamCitySharp.UnitTests", "src\Tests\UnitTests\TeamCitySharp.UnitTests.csproj", "{031165E3-0EC4-4E0D-BF8E-E63C732A1D6F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -36,16 +36,6 @@ Global {BA409A09-CC7B-4A71-A3D4-FE27234A721B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {BA409A09-CC7B-4A71-A3D4-FE27234A721B}.Release|Mixed Platforms.Build.0 = Release|Any CPU {BA409A09-CC7B-4A71-A3D4-FE27234A721B}.Release|x86.ActiveCfg = Release|Any CPU - {1DA175C4-2A6F-4B52-A9B4-87D382150AE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1DA175C4-2A6F-4B52-A9B4-87D382150AE9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1DA175C4-2A6F-4B52-A9B4-87D382150AE9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1DA175C4-2A6F-4B52-A9B4-87D382150AE9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {1DA175C4-2A6F-4B52-A9B4-87D382150AE9}.Debug|x86.ActiveCfg = Debug|Any CPU - {1DA175C4-2A6F-4B52-A9B4-87D382150AE9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1DA175C4-2A6F-4B52-A9B4-87D382150AE9}.Release|Any CPU.Build.0 = Release|Any CPU - {1DA175C4-2A6F-4B52-A9B4-87D382150AE9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {1DA175C4-2A6F-4B52-A9B4-87D382150AE9}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {1DA175C4-2A6F-4B52-A9B4-87D382150AE9}.Release|x86.ActiveCfg = Release|Any CPU {419C8D24-ED8A-47BE-87BB-8790534FEF09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {419C8D24-ED8A-47BE-87BB-8790534FEF09}.Debug|Any CPU.Build.0 = Debug|Any CPU {419C8D24-ED8A-47BE-87BB-8790534FEF09}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -58,13 +48,25 @@ Global {419C8D24-ED8A-47BE-87BB-8790534FEF09}.Release|Mixed Platforms.Build.0 = Release|Any CPU {419C8D24-ED8A-47BE-87BB-8790534FEF09}.Release|x86.ActiveCfg = Release|Any CPU {419C8D24-ED8A-47BE-87BB-8790534FEF09}.Release|x86.Build.0 = Release|Any CPU + {031165E3-0EC4-4E0D-BF8E-E63C732A1D6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {031165E3-0EC4-4E0D-BF8E-E63C732A1D6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {031165E3-0EC4-4E0D-BF8E-E63C732A1D6F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {031165E3-0EC4-4E0D-BF8E-E63C732A1D6F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {031165E3-0EC4-4E0D-BF8E-E63C732A1D6F}.Debug|x86.ActiveCfg = Debug|Any CPU + {031165E3-0EC4-4E0D-BF8E-E63C732A1D6F}.Debug|x86.Build.0 = Debug|Any CPU + {031165E3-0EC4-4E0D-BF8E-E63C732A1D6F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {031165E3-0EC4-4E0D-BF8E-E63C732A1D6F}.Release|Any CPU.Build.0 = Release|Any CPU + {031165E3-0EC4-4E0D-BF8E-E63C732A1D6F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {031165E3-0EC4-4E0D-BF8E-E63C732A1D6F}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {031165E3-0EC4-4E0D-BF8E-E63C732A1D6F}.Release|x86.ActiveCfg = Release|Any CPU + {031165E3-0EC4-4E0D-BF8E-E63C732A1D6F}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {BA409A09-CC7B-4A71-A3D4-FE27234A721B} = {263F35DD-20C1-4209-B121-E962C9328C70} - {1DA175C4-2A6F-4B52-A9B4-87D382150AE9} = {263F35DD-20C1-4209-B121-E962C9328C70} + {031165E3-0EC4-4E0D-BF8E-E63C732A1D6F} = {263F35DD-20C1-4209-B121-E962C9328C70} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {81D02472-9664-494C-B6A4-0D6ABBD44EC7} diff --git a/icon.png b/icon.png new file mode 100644 index 00000000..47ea94a8 Binary files /dev/null and b/icon.png differ diff --git a/src/TeamCitySharp/ActionTypes/Tests.cs b/src/TeamCitySharp/ActionTypes/Tests.cs index 227c5839..d6025a54 100644 --- a/src/TeamCitySharp/ActionTypes/Tests.cs +++ b/src/TeamCitySharp/ActionTypes/Tests.cs @@ -6,66 +6,66 @@ namespace TeamCitySharp.ActionTypes { - public class Tests : ITests - { - #region Attributes + public class Tests : ITests + { + #region Attributes - private ITeamCityCaller m_caller; + private ITeamCityCaller m_caller; - #endregion + #endregion - #region Constructor + #region Constructor - internal Tests(ITeamCityCaller caller) - { - m_caller = caller; - } + internal Tests(ITeamCityCaller caller) + { + m_caller = caller; + } - #endregion + #endregion - #region Public Methods + #region Public Methods - public TestOccurrences ByBuildLocator(BuildLocator locator) - { - return m_caller.Get($"/testOccurrences?locator=build:({locator})"); - } + public TestOccurrences ByBuildLocator(BuildLocator locator) + { + return m_caller.Get($"/testOccurrences?locator=currentlyFailing:true&build:({locator})&fields=testOccurrence(id,name,status,href,details,duration,newFailure,metadata)"); + } - public TestOccurrences ByProjectLocator(ProjectLocator locator) - { - return m_caller.Get($"/testOccurrences?locator=currentlyFailing:true,affectedProject:({locator})"); - } + public TestOccurrences ByProjectLocator(ProjectLocator locator) + { + return m_caller.Get($"/testOccurrences?locator=currentlyFailing:true,affectedProject:({locator})&fields=testOccurrence(id,name,status,href,details,duration,newFailure,metadata,build)"); + } - public TestOccurrences ByTestLocator(TestLocator locator) - { - return m_caller.Get($"/testOccurrences?locator=test:({locator})"); - } + public TestOccurrences ByTestLocator(TestLocator locator) + { + return m_caller.Get($"/testOccurrences?locator=test:({locator})"); + } - public List All(BuildLocator locator) - { - return AllResults(ByBuildLocator(locator)); - } + public List All(BuildLocator locator) + { + return AllResults(ByBuildLocator(locator)); + } - public List All(ProjectLocator locator) - { - return AllResults(ByProjectLocator(locator)); - } + public List All(ProjectLocator locator) + { + return AllResults(ByProjectLocator(locator)); + } - public List All(TestLocator locator) - { - return AllResults(ByTestLocator(locator)); - } - #endregion - #region Private Method - private List AllResults(TestOccurrences firstPageResult) - { - var result = new List() { firstPageResult }; - while (!(string.IsNullOrEmpty(result.Last().NextHref))) - { - var response = m_caller.GetNextHref(result.Last().NextHref); - result.Add(response); - } - return result; + public List All(TestLocator locator) + { + return AllResults(ByTestLocator(locator)); + } + #endregion + #region Private Method + private List AllResults(TestOccurrences firstPageResult) + { + var result = new List() { firstPageResult }; + while (!(string.IsNullOrEmpty(result.Last().NextHref))) + { + var response = m_caller.GetNextHref(result.Last().NextHref); + result.Add(response); + } + return result; + } + #endregion } - #endregion - } } diff --git a/src/TeamCitySharp/DomainEntities/BuildConfig.cs b/src/TeamCitySharp/DomainEntities/BuildConfig.cs index c89e6b55..3b80e8e5 100644 --- a/src/TeamCitySharp/DomainEntities/BuildConfig.cs +++ b/src/TeamCitySharp/DomainEntities/BuildConfig.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; +using System.Linq; namespace TeamCitySharp.DomainEntities { @@ -9,6 +10,9 @@ public override string ToString() return Name; } + [JsonIgnore] + public string BuildName => Id?.Split('_')?.ElementAtOrDefault(1); + [JsonProperty("id")] public string Id { get; set; } diff --git a/src/TeamCitySharp/DomainEntities/TestOccurrence.cs b/src/TeamCitySharp/DomainEntities/TestOccurrence.cs index c2f21817..6deb9b52 100644 --- a/src/TeamCitySharp/DomainEntities/TestOccurrence.cs +++ b/src/TeamCitySharp/DomainEntities/TestOccurrence.cs @@ -1,66 +1,96 @@ using System.Collections.Generic; +using System.Linq; using Newtonsoft.Json; namespace TeamCitySharp.DomainEntities { - public class TestOccurrence - { - public override string ToString() + public class TestMetadata { - return "testOccurrence"; + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("value")] + public string Value { get; set; } } - [JsonProperty("id")] - public string Id { get; set; } - [JsonProperty("name")] - public string Name { get; set; } + public class TestMetadataContainer + { + [JsonProperty("count")] + public int Count { get; set; } + + [JsonProperty("typedValues")] + public List Metadata { get; set; } + } + + public class TestOccurrence + { + public override string ToString() + { + return "testOccurrence"; + } + - [JsonProperty("status")] - public string Status { get; set; } + [JsonIgnore] + public string BuildName => Name?.Split(':')?.ElementAtOrDefault(0)?.Replace(".dll", "")?.Replace(".", ""); - [JsonProperty("ignored")] - public bool Ignored { get; set; } + [JsonProperty("id")] + public string Id { get; set; } - [JsonProperty("duration")] - public int Duration { get; set; } + [JsonProperty("name")] + public string Name { get; set; } - [JsonProperty("runOrder")] - public string RunOrder { get; set; } + [JsonProperty("status")] + public string Status { get; set; } - [JsonProperty("muted")] - public bool Muted { get; set; } + [JsonProperty("ignored")] + public bool Ignored { get; set; } - [JsonProperty("currentlyMuted")] - public bool CurrentlyMuted { get; set; } + [JsonProperty("duration")] + public int Duration { get; set; } - [JsonProperty("currentlyInvestigated")] - public bool CurrentlyInvestigated { get; set; } + [JsonProperty("runOrder")] + public string RunOrder { get; set; } - [JsonProperty("href")] - public string Href { get; set; } + [JsonProperty("muted")] + public bool Muted { get; set; } - [JsonProperty("ignoreDetails")] - public string IgnoreDetails { get; set; } + [JsonProperty("currentlyMuted")] + public bool CurrentlyMuted { get; set; } - [JsonProperty("details")] - public string Details { get; set; } + [JsonProperty("currentlyInvestigated")] + public bool CurrentlyInvestigated { get; set; } - [JsonProperty("test")] - public Test Test { get; set; } + [JsonProperty("href")] + public string Href { get; set; } - [JsonProperty("mute")] - public Mute Mute { get; set; } + [JsonProperty("ignoreDetails")] + public string IgnoreDetails { get; set; } - [JsonProperty("build")] - public Build Build { get; set; } + [JsonProperty("details")] + public string Details { get; set; } - [JsonProperty("firstFailed")] - public Build FirstFailed { get; set; } + [JsonProperty("test")] + public Test Test { get; set; } - [JsonProperty("nextFixed")] - public Build NextFixed { get; set; } + [JsonProperty("mute")] + public Mute Mute { get; set; } - [JsonProperty("logAnchor")] - public string LogAnchor { get; set; } - } + [JsonProperty("build")] + public Build Build { get; set; } + + [JsonProperty("firstFailed")] + public Build FirstFailed { get; set; } + + [JsonProperty("nextFixed")] + public Build NextFixed { get; set; } + + [JsonProperty("logAnchor")] + public string LogAnchor { get; set; } + + [JsonProperty("newFailure")] + public bool? NewFailure { get; set; } + + [JsonProperty("metadata")] + public TestMetadataContainer Metadata { get; set; } + } } diff --git a/src/TeamCitySharp/TeamCitySharp.csproj b/src/TeamCitySharp/TeamCitySharp.csproj index f1770ebf..9a7a2265 100644 --- a/src/TeamCitySharp/TeamCitySharp.csproj +++ b/src/TeamCitySharp/TeamCitySharp.csproj @@ -1,33 +1,31 @@ + - netstandard2.0;net45 - 2.0.12 + netstandard2.0 + MvsTelecom.Teamcity.Api + MVS Telecom + MVS Telecom + 0.0.0.3 + https://github.com/MVS-Telecom/mvstelecom-teamcity-api + icon.png + C# API client for TeamCity + MvsTelecom.Teamcity.Api - + + NETCORE;NETSTANDARD;NETSTANDARD2_0 - + + - - - - - - - - - - - - - - - - NET45;NETFULL - - - + + + + True + + + \ No newline at end of file diff --git a/src/Tests/UnitTests/ActionTypes/ServerInformationTest.cs b/src/Tests/UnitTests/ActionTypes/ServerInformationTest.cs index a01e05ac..6cb78b5b 100644 --- a/src/Tests/UnitTests/ActionTypes/ServerInformationTest.cs +++ b/src/Tests/UnitTests/ActionTypes/ServerInformationTest.cs @@ -2,65 +2,89 @@ namespace TeamCitySharp.ActionTypes { - using FakeItEasy; - using FluentAssertions; - using NUnit.Framework; - using TeamCitySharp.Connection; + using FakeItEasy; + using FluentAssertions; + using NUnit.Framework; + using System.Collections.Generic; + using System.Linq; + using TeamCitySharp.Connection; + using TeamCitySharp.Locators; - [TestFixture] - public class ServerInformationTest - { - private ServerInformation testee; - private ITeamCityCaller teamCityCaller; - - [SetUp] - public void SetUp() + [TestFixture] + public class ServerInformationTest { - this.teamCityCaller = A.Fake(); - this.testee = new ServerInformation(this.teamCityCaller); - } + private ServerInformation testee; + private ITeamCityCaller teamCityCaller; - [TestCase(true, true, true, true)] - [TestCase(false, false, false, false)] - [TestCase(true, false, false, false)] - [TestCase(false, true, false, false)] - [TestCase(false, false, true, false)] - [TestCase(false, false, false, true)] - public void CreatesBackupWithSelectedParts(bool includeBuildLogs, bool includeConfigurations, bool includeDatabase, - bool includePersonalChanges) - { - const string Filename = "Filename"; - var backupOptions = new BackupOptions + [SetUp] + public void SetUp() { - Filename = Filename, - IncludeBuildLogs = includeBuildLogs, - IncludeConfigurations = includeConfigurations, - IncludeDatabase = includeDatabase, - IncludePersonalChanges = includePersonalChanges - }; + this.teamCityCaller = A.Fake(); + this.testee = new ServerInformation(this.teamCityCaller); + } - this.testee.TriggerServerInstanceBackup(backupOptions); + [TestCase(true, true, true, true)] + [TestCase(false, false, false, false)] + [TestCase(true, false, false, false)] + [TestCase(false, true, false, false)] + [TestCase(false, false, true, false)] + [TestCase(false, false, false, true)] + public void CreatesBackupWithSelectedParts(bool includeBuildLogs, bool includeConfigurations, bool includeDatabase, + bool includePersonalChanges) + { + const string Filename = "Filename"; + var backupOptions = new BackupOptions + { + Filename = Filename, + IncludeBuildLogs = includeBuildLogs, + IncludeConfigurations = includeConfigurations, + IncludeDatabase = includeDatabase, + IncludePersonalChanges = includePersonalChanges + }; - A.CallTo(() => this.teamCityCaller.StartBackup(string.Concat( - "/server/backup?fileName=", - Filename, - "&includeBuildLogs=" + includeBuildLogs, - "&includeConfigs=" + includeConfigurations, - "&includeDatabase=" + includeDatabase, - "&includePersonalChanges=" + includePersonalChanges))) - .MustHaveHappened(); - } + this.testee.TriggerServerInstanceBackup(backupOptions); - [Test] - public void GetsBackupStatus() - { - const string Status = "Idle"; + A.CallTo(() => this.teamCityCaller.StartBackup(string.Concat( + "/server/backup?fileName=", + Filename, + "&includeBuildLogs=" + includeBuildLogs, + "&includeConfigs=" + includeConfigurations, + "&includeDatabase=" + includeDatabase, + "&includePersonalChanges=" + includePersonalChanges))) + .MustHaveHappened(); + } + + [Test] + public void GetsBackupStatus() + { + const string Status = "Idle"; + + A.CallTo(() => this.teamCityCaller.GetRaw("/server/backup")).Returns(Status); + + string status = this.testee.GetBackupStatus(); + + status.Should().Be(Status); + } + + + [Test] + public void Test() + { + var projectName = "ExtraCheckTest"; + var api = new TeamCityClient("build.mvstelecom.ru"); + api.ConnectWithAccessToken("eyJ0eXAiOiAiVENWMiJ9.V0R5T1k5R0tPTklESUctNndDQjhkOVFkYzVn.OTczMGJhZGItMzVkYy00Y2QyLThmYWUtODg1NTk0N2RlYWFl"); - A.CallTo(() => this.teamCityCaller.GetRaw("/server/backup")).Returns(Status); + var project = api.Projects.ById(projectName); + var tests = api.Tests.ByProjectLocator(ProjectLocator.WithId(projectName)); - string status = this.testee.GetBackupStatus(); + var disabled = project.BuildTypes.BuildType + .Where(x => x.Name.StartsWith("[disabled]")) + .Select(x => x.Id) + .ToList(); - status.Should().Be(Status); + var actualTests = tests.TestOccurrence + .Where(x => !disabled.Contains(x.Build.BuildTypeId)) + .ToList(); + } } - } } \ No newline at end of file diff --git a/src/Tests/UnitTests/Properties/AssemblyInfo.cs b/src/Tests/UnitTests/Properties/AssemblyInfo.cs deleted file mode 100644 index 5e7ac8fc..00000000 --- a/src/Tests/UnitTests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. - -[assembly: AssemblyTitle("TeamCitySharp.UnitTests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("TeamCitySharp.UnitTests")] -[assembly: AssemblyCopyright("Copyright © 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. - -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM - -[assembly: Guid("ffe7fbda-d6b9-459f-9b4d-a8d7858bd053")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/src/Tests/UnitTests/TeamCitySharp.UnitTests.csproj b/src/Tests/UnitTests/TeamCitySharp.UnitTests.csproj index 481a57c5..56165f16 100644 --- a/src/Tests/UnitTests/TeamCitySharp.UnitTests.csproj +++ b/src/Tests/UnitTests/TeamCitySharp.UnitTests.csproj @@ -1,88 +1,21 @@ - - - - + + - Debug - AnyCPU - {1DA175C4-2A6F-4B52-A9B4-87D382150AE9} - Library - Properties - TeamCitySharp - TeamCitySharp.UnitTests - v4.5 - 512 - - - + net5.0 + + false - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - true - false - - - - ..\..\..\packages\FakeItEasy.1.25.3\lib\net40\FakeItEasy.dll - - - ..\..\..\packages\FluentAssertions.2.0.1\lib\net40\FluentAssertions.dll - - - ..\..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - - - ..\..\..\packages\NUnit.3.0.1\lib\net40\nunit.framework.dll - - - - - - - - - - - - - - + - + + + + + + - - {419c8d24-ed8a-47be-87bb-8790534fef09} - TeamCitySharp - + - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - \ No newline at end of file + + diff --git a/src/Tests/UnitTests/packages.config b/src/Tests/UnitTests/packages.config deleted file mode 100644 index c3e83916..00000000 --- a/src/Tests/UnitTests/packages.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file