diff --git a/AzureDevopsTracker.sln b/AzureDevopsTracker.sln index b715220..cf25253 100644 --- a/AzureDevopsTracker.sln +++ b/AzureDevopsTracker.sln @@ -5,6 +5,12 @@ VisualStudioVersion = 17.2.32616.157 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AzureDevopsTracker", "src\AzureDevopsTracker.csproj", "{36601E24-C989-4E11-BD8F-572F2F181ED1}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{816B80C1-D0DA-4925-817C-692A5995BCB2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{035AD571-2D23-4A55-9FBB-1E99758306C8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureDevopsTracker.Tests", "tests\AzureDevopsTracker.Tests\AzureDevopsTracker.Tests.csproj", "{BA1D5DF9-E25A-4984-8072-8CA3C5FC638D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,10 +21,18 @@ Global {36601E24-C989-4E11-BD8F-572F2F181ED1}.Debug|Any CPU.Build.0 = Debug|Any CPU {36601E24-C989-4E11-BD8F-572F2F181ED1}.Release|Any CPU.ActiveCfg = Release|Any CPU {36601E24-C989-4E11-BD8F-572F2F181ED1}.Release|Any CPU.Build.0 = Release|Any CPU + {BA1D5DF9-E25A-4984-8072-8CA3C5FC638D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BA1D5DF9-E25A-4984-8072-8CA3C5FC638D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BA1D5DF9-E25A-4984-8072-8CA3C5FC638D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BA1D5DF9-E25A-4984-8072-8CA3C5FC638D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {36601E24-C989-4E11-BD8F-572F2F181ED1} = {035AD571-2D23-4A55-9FBB-1E99758306C8} + {BA1D5DF9-E25A-4984-8072-8CA3C5FC638D} = {816B80C1-D0DA-4925-817C-692A5995BCB2} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {53133A2B-5357-47B5-A1C4-30953F789623} EndGlobalSection diff --git a/src/Entities/ChangeLog.cs b/src/Entities/ChangeLog.cs index 33cf708..564eb4a 100644 --- a/src/Entities/ChangeLog.cs +++ b/src/Entities/ChangeLog.cs @@ -13,18 +13,15 @@ public class ChangeLog : Entity public IReadOnlyCollection ChangeLogItems => _changeLogItems; private ChangeLog() { } + public ChangeLog(string number) => Number = number; public ChangeLog(int newRevision) { Revision = newRevision; Number = $"{CreatedAt:yyyyMMdd}.{Revision}"; } - public ChangeLog(string number) => Number = number; - public void SetResponse(string response) => Response = response; - public void ClearResponse() => Response = string.Empty; - private bool CheckChangeLogItem(ChangeLogItem changeLogItem) => _changeLogItems.Any(x => x.WorkItemId == changeLogItem.WorkItemId); public void AddChangeLogItem(ChangeLogItem changeLogItem) @@ -45,9 +42,7 @@ public void AddChangeLogItems(IEnumerable changeLogItems) throw new Exception("ChangeLogItems is required"); foreach (var changeLogItem in changeLogItems) - { AddChangeLogItem(changeLogItem); - } } } } \ No newline at end of file diff --git a/tests/AzureDevopsTracker.Tests/AzureDevopsTracker.Tests.csproj b/tests/AzureDevopsTracker.Tests/AzureDevopsTracker.Tests.csproj new file mode 100644 index 0000000..97fe960 --- /dev/null +++ b/tests/AzureDevopsTracker.Tests/AzureDevopsTracker.Tests.csproj @@ -0,0 +1,29 @@ + + + + net6.0 + enable + enable + + false + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/tests/AzureDevopsTracker.Tests/Entities/ChangeLogTests.cs b/tests/AzureDevopsTracker.Tests/Entities/ChangeLogTests.cs new file mode 100644 index 0000000..b8488ae --- /dev/null +++ b/tests/AzureDevopsTracker.Tests/Entities/ChangeLogTests.cs @@ -0,0 +1,105 @@ +namespace AzureDevopsTracker.Tests.Entities +{ + public class ChangeLogTests + { + [Theory(DisplayName = "ChangeLog - New with NewRevision")] + [InlineData(12345)] + [InlineData(65489)] + public void ChangeLog_NewWithRevision(int newRevision) + { + var changeLog = new ChangeLog(newRevision); + + changeLog.Id.Should().NotBeNullOrEmpty(); + changeLog.Revision.Should().Be(newRevision); + changeLog.Number.Should().Be($"{changeLog.CreatedAt:yyyyMMdd}.{newRevision}"); + changeLog.ChangeLogItems.Should().BeEmpty(); + } + + [Theory(DisplayName = "ChangeLog - New with Number")] + [InlineData("12345")] + [InlineData("abcde")] + public void ChangeLog_NewWithNumber(string number) + { + var changeLog = new ChangeLog(number); + + changeLog.Id.Should().NotBeNullOrEmpty(); + changeLog.Number.Should().Be(number); + changeLog.Revision.Should().Be(0); + changeLog.ChangeLogItems.Should().BeEmpty(); + } + + [Fact(DisplayName = "ChangeLog - SetResponse")] + public void ChangeLog_SetResponse() + { + var newResponse = "new response"; + var changeLog = new ChangeLog("abc"); + + changeLog.SetResponse(newResponse); + + changeLog.Response.Should().Be(newResponse); + } + + [Fact(DisplayName = "ChangeLog - ClearResponse")] + public void ChangeLog_ClearResponse() + { + var newResponse = "new response"; + var changeLog = new ChangeLog("abc"); + changeLog.SetResponse(newResponse); + + changeLog.ClearResponse(); + + changeLog.Response.Should().BeEmpty(); + } + + [Theory(DisplayName = "ChangeLog - AddChangeLogItem")] + [InlineData("123", "test", "just a test", "bug", true)] + [InlineData("654", "test", "just a test", "feature", false)] + public void ChangeLog_CheckChangeLogItem(string workItemId, string title, string description, string type, bool exist) + { + var changeLog = new ChangeLog("abc"); + changeLog.AddChangeLogItem(new ChangeLogItem("123", title, description, type)); + + var changeLogItem = new ChangeLogItem(workItemId, title, description, type); + changeLog.AddChangeLogItem(changeLogItem); + + if (exist) + changeLog.ChangeLogItems.Should().NotContain(changeLogItem); + else + changeLog.ChangeLogItems.Should().Contain(changeLogItem); + } + + [Fact(DisplayName = "ChangeLog - AddChangeLogItem should throw exception")] + public void ChangeLog_AddChangeLogItem_ThrowException() + { + var changeLog = new ChangeLog("abc"); + var mensagemEsperada = Assert.Throws(() => changeLog.AddChangeLogItem(null)).Message; + + mensagemEsperada.Should().Be("ChangeLogItem is required"); + } + + [Fact(DisplayName = "ChangeLog - AddChangeLogItems")] + public void ChangeLog_AddChangeLogItems() + { + var changeLog = new ChangeLog("abc"); + var changeLogItems = new List + { + new ChangeLogItem("123", "test", "just a test", "bug"), + new ChangeLogItem("654", "test", "just a test", "feature") + }; + + changeLog.AddChangeLogItems(changeLogItems); + + changeLog.ChangeLogItems.Should().Contain(changeLogItems); + } + + [Fact(DisplayName = "ChangeLog - AddChangeLogItems should throw exception")] + public void ChangeLog_AddChangeLogItems_ThrowException() + { + var changeLog = new ChangeLog("abc"); + + var mensagemEsperada = Assert.Throws(() => changeLog.AddChangeLogItems(null)).Message; + + mensagemEsperada.Should().Be("ChangeLogItems is required"); + } + } +} \ No newline at end of file diff --git a/tests/AzureDevopsTracker.Tests/Entities/TimeByStateTests.cs b/tests/AzureDevopsTracker.Tests/Entities/TimeByStateTests.cs new file mode 100644 index 0000000..6980acd --- /dev/null +++ b/tests/AzureDevopsTracker.Tests/Entities/TimeByStateTests.cs @@ -0,0 +1,36 @@ +namespace AzureDevopsTracker.Tests.Entities +{ + public class TimeByStateTests + { + [Fact(DisplayName = "TimeByState - New")] + public void TimeByState_New() + { + var workItemId = "123"; + var state = "new"; + var totalTime = new TimeSpan(1, 0, 3); + var totalWorkedTime = new TimeSpan(2, 3, 40); + var timeByState = new TimeByState(workItemId, state, totalTime, totalWorkedTime); + + timeByState.Id.Should().NotBeNullOrEmpty(); + timeByState.WorkItemId.Should().Be(workItemId); + timeByState.State.Should().Be(state); + timeByState.TotalTime.Should().Be(totalTime.TotalSeconds); + timeByState.TotalWorkedTime.Should().Be(totalWorkedTime.TotalSeconds); + } + + [Theory(DisplayName = "TimeByState - Validate")] + [InlineData("", "new", "WorkItemId is required")] + [InlineData(null, "", "WorkItemId is required")] + [InlineData("123", "", "State is required")] + [InlineData("123", null, "State is required")] + public void TimeByState_Update(string workItemId, string state, string throwMessage) + { + var totalTime = new TimeSpan(1, 0, 3); + var totalWorkedTime = new TimeSpan(2, 3, 40); + + var mensagemEsperada = Assert.Throws(() => new TimeByState(workItemId, state, totalTime, totalWorkedTime)).Message; + + mensagemEsperada.Should().Be(throwMessage); + } + } +} \ No newline at end of file diff --git a/tests/AzureDevopsTracker.Tests/Entities/WorkItemCustomFieldTests.cs b/tests/AzureDevopsTracker.Tests/Entities/WorkItemCustomFieldTests.cs new file mode 100644 index 0000000..25b2903 --- /dev/null +++ b/tests/AzureDevopsTracker.Tests/Entities/WorkItemCustomFieldTests.cs @@ -0,0 +1,31 @@ +namespace AzureDevopsTracker.Tests.Entities +{ + public class WorkItemCustomFieldTests + { + [Theory(DisplayName = "CustomField - New")] + [InlineData("12345", "key", "value")] + [InlineData("65489", "key1", "value")] + [InlineData("test", "key", "value1")] + public void CustomField_New(string workItemId, string key, string value) + { + var customField = new WorkItemCustomField(workItemId, key, value); + + customField.WorkItemId.Should().Be(workItemId); + customField.Key.Should().Be(key); + customField.Value.Should().Be(value); + } + + [Theory(DisplayName = "CustomField - Update")] + [InlineData("value")] + [InlineData("new_value")] + [InlineData("value1")] + public void CustomField_Update(string value) + { + var customField = new WorkItemCustomField(Guid.NewGuid().ToString(), "key", ""); + + customField.Update(value); + + customField.Value.Should().Be(value); + } + } +} \ No newline at end of file diff --git a/tests/AzureDevopsTracker.Tests/Usings.cs b/tests/AzureDevopsTracker.Tests/Usings.cs new file mode 100644 index 0000000..209548e --- /dev/null +++ b/tests/AzureDevopsTracker.Tests/Usings.cs @@ -0,0 +1,3 @@ +global using Xunit; +global using AzureDevopsTracker.Entities; +global using FluentAssertions; \ No newline at end of file