diff --git a/.gitignore b/.gitignore index dfcfd56..3cab525 100644 --- a/.gitignore +++ b/.gitignore @@ -348,3 +348,9 @@ MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ + +.sonarqube + +*.bat + +*.xml \ No newline at end of file diff --git a/adt_pull_request.yml b/adt_pull_request.yml index d83a83f..32668b7 100644 --- a/adt_pull_request.yml +++ b/adt_pull_request.yml @@ -10,67 +10,29 @@ steps: organization: typinghard projectKey: 'typinghard_azure-devops-tracker' extraProperties: | - # Additional properties that will be passed to the scanner, - # Put one key=value per line, example: - # sonar.exclusions=**/*.bin - #sonar.coverageReportPaths=$(Agent.TempDirectory)/**/*.trx - #sonar.cs.opencover.reportsPaths=$(Agent.TempDirectory)/**/*.trx - #sonar.coverageReportPaths=$(Agent.TempDirectory)/reports/SonarQube.xml - #sonar.cs.dotcover.reportsPaths=$(Agent.TempDirectory)/reports/DetailedXML.xml - sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/**/coverage.opencover.xml - sonar.cs.vstest.reportsPaths=$(Agent.TempDirectory)/**/*.trx - sonar.cs.opencover.reportsPaths=$(Agent.TempDirectory)\**\*.trx - sonar.cs.vstest.reportsPaths=$(Agent.TempDirectory)\**\*.trx - sonar.cs.vscoveragexml.reportsPaths=$(Agent.TempDirectory)\**\*.coveragexml - sonar.cs.vscoveragexml.reportsPaths=coverage.xml - sonar.cs.opencover.reportsPaths=coverage.xml - sonar.verbose=true - + sonar.exclusions=**/obj/**,**/*.dll + sonar.cs.opencover.reportsPaths=$(Agent.TempDirectory)/**/coverage.opencover.xml + sonar.cs.vstest.reportsPaths=$(Agent.TempDirectory)/*.trx - task: CmdLine@2 inputs: script: dotnet restore - displayName: 'Rodando dotnet restore' + displayName: 'Run dotnet restore' - task: CmdLine@2 inputs: script: dotnet build --no-incremental - displayName: 'Rodando dotnet build' - -- task: DotNetCoreCLI@2 - displayName: 'Rodando dotnet test' - inputs: - command: test - projects: '**/*[Tt]ests/*.csproj' - arguments: '--configuration $(BuildConfiguration) /p:CollectCoverage=true /p:CoverletOutputFormat=opencover --collect "Code Coverage"' + displayName: 'Run dotnet build' - script: 'dotnet tool install --global coverlet.console' displayName: 'Install coverlet global tool' -#- script: 'reportgenerator -reports:$(Agent.TempDirectory)/**/coverage.cobertura.xml -targetdir:$(Build.SourcesDirectory)/coverlet/reports -reporttypes:"Cobertura"' -# displayName: 'Create reports' - -- script: coverlet *.Tests.dll --target "dotnet" --targetargs "test --no-build" -f=opencover -o="coverage.xml" - displayName: 'Run coverlet' - -- task: PublishTestResults@2 - inputs: - testResultsFormat: 'VSTest' - testResultsFiles: '$(Agent.TempDirectory)/**.*trx' - -#- task: Palmmedia.reportgenerator.reportgenerator-build-release-task.reportgenerator@5 -# displayName: ReportGenerator -# inputs: -# reports: '$(Agent.TempDirectory)/coverage.cobertura.xml' -# targetdir: '$(Build.SourcesDirectory)/reports' -# reporttypes: 'SonarQube' -# assemblyfilters: '-xunit\*' - -- task: PublishCodeCoverageResults@1 - displayName: 'Publish code coverage from $(Build.SourcesDirectory)/coverage.xml' +- task: DotNetCoreCLI@2 + displayName: 'Run dotnet test' inputs: - codeCoverageTool: Cobertura - summaryFileLocation: '$(Build.SourcesDirectory)/coverage.xml' + command: test + projects: '**/*[Tt]ests/*.csproj' + arguments: '--configuration $(BuildConfiguration) /p:CollectCoverage=true /p:CoverletOutputFormat=opencover --collect "Code Coverage" /p:Exclude=[xunit.*]*' - task: SonarSource.sonarcloud.ce096e50-6155-4de8-8800-4221aaeed4a1.SonarCloudAnalyze@1 displayName: 'Run Code Analysis' diff --git a/src/Adapters/WorkItemAdapter.cs b/src/Adapters/WorkItemAdapter.cs index 8b8492b..a7598ac 100644 --- a/src/Adapters/WorkItemAdapter.cs +++ b/src/Adapters/WorkItemAdapter.cs @@ -1,4 +1,4 @@ -using AzureDevopsTracker.DTOs; +using AzureDevopsTracker.Dtos; using AzureDevopsTracker.Entities; using AzureDevopsTracker.Extensions; using AzureDevopsTracker.Interfaces; @@ -10,11 +10,11 @@ namespace AzureDevopsTracker.Adapters { internal class WorkItemAdapter : IWorkItemAdapter { - public WorkItemDTO ToWorkItemDTO(WorkItem workItem) + public WorkItemDto ToWorkItemDto(WorkItem workItem) { if (workItem is null) return null; - return new WorkItemDTO() + return new WorkItemDto() { Id = workItem.Id, CreatedAt = workItem.CreatedAt, @@ -32,30 +32,30 @@ public WorkItemDTO ToWorkItemDTO(WorkItem workItem) WorkItemParentId = workItem.WorkItemParentId, Activity = workItem.Activity, Tags = workItem.Tags is null ? new List() : workItem.Tags.Split(';').ToList(), - WorkItemsChangesDTO = ToWorkItemsChangeDTO(workItem.WorkItemsChanges.OrderBy(x => x.CreatedAt).ToList()), - TimesByStateDTO = ToTimeByStatesDTO(workItem.CalculateTotalTimeByState().ToList()), + WorkItemsChangesDto = ToWorkItemsChangeDto(workItem.WorkItemsChanges.OrderBy(x => x.CreatedAt).ToList()), + TimesByStateDto = ToTimeByStatesDto(workItem.CalculateTotalTimeByState().ToList()), }; } - public List ToWorkItemsDTO(List workItems) + public List ToWorkItemsDto(List workItems) { - var workItemsDTO = new List(); + var workItemsDto = new List(); - if (workItems is null) return workItemsDTO; + if (workItems is null) return workItemsDto; workItems.ForEach( workItem => - workItemsDTO.Add(ToWorkItemDTO(workItem))); + workItemsDto.Add(ToWorkItemDto(workItem))); - return workItemsDTO + return workItemsDto .ToList(); } - public WorkItemChangeDTO ToWorkItemChangeDTO(WorkItemChange workIteChange) + public WorkItemChangeDto ToWorkItemChangeDto(WorkItemChange workIteChange) { if (workIteChange is null) return null; - return new WorkItemChangeDTO() + return new WorkItemChangeDto() { NewDate = workIteChange.NewDate, NewState = workIteChange.NewState, @@ -65,26 +65,26 @@ public WorkItemChangeDTO ToWorkItemChangeDTO(WorkItemChange workIteChange) }; } - public List ToWorkItemsChangeDTO(List workItemsChanges) + public List ToWorkItemsChangeDto(List workItemsChanges) { - var workItemsChangeDTO = new List(); + var workItemsChangeDto = new List(); - if (workItemsChanges is null) return workItemsChangeDTO; + if (workItemsChanges is null) return workItemsChangeDto; workItemsChanges.ForEach( workItemsChange => - workItemsChangeDTO.Add(ToWorkItemChangeDTO(workItemsChange))); + workItemsChangeDto.Add(ToWorkItemChangeDto(workItemsChange))); - return workItemsChangeDTO + return workItemsChangeDto .Where(w => w is not null) .ToList(); } - public TimeByStateDTO ToTimeByStateDTO(TimeByState workItemStatusTime) + public TimeByStateDto ToTimeByStateDto(TimeByState workItemStatusTime) { if (workItemStatusTime is null) return null; - return new TimeByStateDTO() + return new TimeByStateDto() { CreatedAt = workItemStatusTime.CreatedAt, State = workItemStatusTime.State, @@ -93,17 +93,17 @@ public TimeByStateDTO ToTimeByStateDTO(TimeByState workItemStatusTime) }; } - public List ToTimeByStatesDTO(List workItemStatusTimes) + public List ToTimeByStatesDto(List workItemStatusTimes) { - var workItemStatusTimeDTO = new List(); + var workItemStatusTimeDto = new List(); - if (workItemStatusTimes is null) return workItemStatusTimeDTO; + if (workItemStatusTimes is null) return workItemStatusTimeDto; workItemStatusTimes.ForEach( workItemStatusTime => - workItemStatusTimeDTO.Add(ToTimeByStateDTO(workItemStatusTime))); + workItemStatusTimeDto.Add(ToTimeByStateDto(workItemStatusTime))); - return workItemStatusTimeDTO + return workItemStatusTimeDto .Where(w => w is not null) .ToList(); } diff --git a/src/DTOs/Create/CreateWorkItemDTO.cs b/src/DTOs/Create/CreateWorkItemDTO.cs index 26e6126..12897a6 100644 --- a/src/DTOs/Create/CreateWorkItemDTO.cs +++ b/src/DTOs/Create/CreateWorkItemDTO.cs @@ -1,9 +1,9 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace AzureDevopsTracker.DTOs.Create +namespace AzureDevopsTracker.Dtos.Create { - public record CreateWorkItemDTO + public record CreateWorkItemDto { [JsonPropertyName("resource")] [JsonProperty("resource")] diff --git a/src/DTOs/Delete/DeleteWorkItemDTO.cs b/src/DTOs/Delete/DeleteWorkItemDTO.cs index 53d8d27..ecea0c3 100644 --- a/src/DTOs/Delete/DeleteWorkItemDTO.cs +++ b/src/DTOs/Delete/DeleteWorkItemDTO.cs @@ -1,9 +1,9 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace AzureDevopsTracker.DTOs.Delete +namespace AzureDevopsTracker.Dtos.Delete { - public record DeleteWorkItemDTO + public record DeleteWorkItemDto { [JsonPropertyName("resource")] [JsonProperty("resource")] diff --git a/src/DTOs/Fields.cs b/src/DTOs/Fields.cs index 5b37626..f1a0a2f 100644 --- a/src/DTOs/Fields.cs +++ b/src/DTOs/Fields.cs @@ -2,7 +2,7 @@ using System; using System.Text.Json.Serialization; -namespace AzureDevopsTracker.DTOs +namespace AzureDevopsTracker.Dtos { public record Fields { diff --git a/src/DTOs/Resource.cs b/src/DTOs/Resource.cs index 45cf0a3..2a4624b 100644 --- a/src/DTOs/Resource.cs +++ b/src/DTOs/Resource.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace AzureDevopsTracker.DTOs +namespace AzureDevopsTracker.Dtos { public record Resource { diff --git a/src/DTOs/Restore/RestoreWorkItemDTO.cs b/src/DTOs/Restore/RestoreWorkItemDTO.cs index 0aead27..82c1695 100644 --- a/src/DTOs/Restore/RestoreWorkItemDTO.cs +++ b/src/DTOs/Restore/RestoreWorkItemDTO.cs @@ -1,9 +1,9 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace AzureDevopsTracker.DTOs.Restore +namespace AzureDevopsTracker.Dtos.Restore { - public record RestoreWorkItemDTO + public record RestoreWorkItemDto { [JsonPropertyName("resource")] [JsonProperty("resource")] diff --git a/src/DTOs/Update/UpdateWorkItemDTO.cs b/src/DTOs/Update/UpdateWorkItemDTO.cs index 714131d..3f59018 100644 --- a/src/DTOs/Update/UpdateWorkItemDTO.cs +++ b/src/DTOs/Update/UpdateWorkItemDTO.cs @@ -2,9 +2,9 @@ using System; using System.Text.Json.Serialization; -namespace AzureDevopsTracker.DTOs.Update +namespace AzureDevopsTracker.Dtos.Update { - public record UpdatedWorkItemDTO + public record UpdatedWorkItemDto { [JsonPropertyName("resource")] [JsonProperty("resource")] diff --git a/src/DTOs/WorkItemDTO.cs b/src/DTOs/WorkItemDTO.cs index 46ef511..9553f89 100644 --- a/src/DTOs/WorkItemDTO.cs +++ b/src/DTOs/WorkItemDTO.cs @@ -2,9 +2,9 @@ using System; using System.Collections.Generic; -namespace AzureDevopsTracker.DTOs +namespace AzureDevopsTracker.Dtos { - public record WorkItemDTO + public record WorkItemDto { [JsonProperty("id")] public string Id { get; init; } @@ -55,13 +55,13 @@ public record WorkItemDTO public IEnumerable Tags { get; init; } [JsonProperty("workItems_changes")] - public List WorkItemsChangesDTO { get; init; } + public List WorkItemsChangesDto { get; init; } [JsonProperty("times_by_state")] - public List TimesByStateDTO { get; init; } + public List TimesByStateDto { get; init; } } - public record WorkItemChangeDTO + public record WorkItemChangeDto { [JsonProperty("new_date")] public DateTime NewDate { get; init; } @@ -80,7 +80,7 @@ public record WorkItemChangeDTO } - public record TimeByStateDTO + public record TimeByStateDto { [JsonProperty("created_at")] public DateTime CreatedAt { get; init; } diff --git a/src/Entities/Entity.cs b/src/Entities/Entity.cs index 1239024..88a3328 100644 --- a/src/Entities/Entity.cs +++ b/src/Entities/Entity.cs @@ -7,13 +7,13 @@ public abstract class Entity public string Id { get; protected set; } public DateTime CreatedAt { get; private set; } - public Entity(string id) + protected Entity(string id) { Id = id ?? Guid.NewGuid().ToString(); CreatedAt = DateTime.UtcNow; } - public Entity() + protected Entity() { Id = Guid.NewGuid().ToString(); CreatedAt = DateTime.UtcNow; diff --git a/src/Interfaces/IAzureDevopsTrackerService.cs b/src/Interfaces/IAzureDevopsTrackerService.cs index 83dfe78..4e1b309 100644 --- a/src/Interfaces/IAzureDevopsTrackerService.cs +++ b/src/Interfaces/IAzureDevopsTrackerService.cs @@ -1,18 +1,18 @@ -using AzureDevopsTracker.DTOs; -using AzureDevopsTracker.DTOs.Create; -using AzureDevopsTracker.DTOs.Delete; -using AzureDevopsTracker.DTOs.Restore; -using AzureDevopsTracker.DTOs.Update; +using AzureDevopsTracker.Dtos; +using AzureDevopsTracker.Dtos.Create; +using AzureDevopsTracker.Dtos.Delete; +using AzureDevopsTracker.Dtos.Restore; +using AzureDevopsTracker.Dtos.Update; using System.Threading.Tasks; namespace AzureDevopsTracker.Interfaces { public interface IAzureDevopsTrackerService { - Task Create(CreateWorkItemDTO createDto, bool addWorkItemChange = true); - Task Update(UpdatedWorkItemDTO updateDto); - Task Delete(DeleteWorkItemDTO deleteDto); - Task Restore(RestoreWorkItemDTO restoreDto); - Task GetByWorkItemId(string workItemId); + Task Create(CreateWorkItemDto createDto, bool addWorkItemChange = true); + Task Update(UpdatedWorkItemDto updateDto); + Task Delete(DeleteWorkItemDto deleteDto); + Task Restore(RestoreWorkItemDto restoreDto); + Task GetByWorkItemId(string workItemId); } } \ No newline at end of file diff --git a/src/Interfaces/IWorkItemAdapter.cs b/src/Interfaces/IWorkItemAdapter.cs index 79f33b6..dc545e1 100644 --- a/src/Interfaces/IWorkItemAdapter.cs +++ b/src/Interfaces/IWorkItemAdapter.cs @@ -1,4 +1,4 @@ -using AzureDevopsTracker.DTOs; +using AzureDevopsTracker.Dtos; using AzureDevopsTracker.Entities; using System.Collections.Generic; @@ -6,7 +6,7 @@ namespace AzureDevopsTracker.Interfaces { public interface IWorkItemAdapter { - WorkItemDTO ToWorkItemDTO(WorkItem workItem); - List ToWorkItemsDTO(List workItems); + WorkItemDto ToWorkItemDto(WorkItem workItem); + List ToWorkItemsDto(List workItems); } } \ No newline at end of file diff --git a/src/Services/AzureDevopsTrackerService.cs b/src/Services/AzureDevopsTrackerService.cs index ce67781..06ccd9f 100644 --- a/src/Services/AzureDevopsTrackerService.cs +++ b/src/Services/AzureDevopsTrackerService.cs @@ -1,8 +1,8 @@ -using AzureDevopsTracker.DTOs; -using AzureDevopsTracker.DTOs.Create; -using AzureDevopsTracker.DTOs.Delete; -using AzureDevopsTracker.DTOs.Restore; -using AzureDevopsTracker.DTOs.Update; +using AzureDevopsTracker.Dtos; +using AzureDevopsTracker.Dtos.Create; +using AzureDevopsTracker.Dtos.Delete; +using AzureDevopsTracker.Dtos.Restore; +using AzureDevopsTracker.Dtos.Update; using AzureDevopsTracker.Entities; using AzureDevopsTracker.Extensions; using AzureDevopsTracker.Helpers; @@ -36,7 +36,7 @@ public AzureDevopsTrackerService( _httpContextAccessor = httpContextAccessor; } - public async Task Create(CreateWorkItemDTO create, bool addWorkItemChange = true) + public async Task Create(CreateWorkItemDto create, bool addWorkItemChange = true) { var workItem = new WorkItem(create.Resource.Id); @@ -67,9 +67,9 @@ public async Task Create(CreateWorkItemDTO create, bool addWorkItemChange = true public async Task Create(string workItemId, Fields fields) { - var createDto = new CreateWorkItemDTO() + var createDto = new CreateWorkItemDto() { - Resource = new DTOs.Resource() + Resource = new Dtos.Resource() { Fields = fields, Id = workItemId, @@ -79,7 +79,7 @@ public async Task Create(string workItemId, Fields fields) await Create(createDto, false); } - public async Task Update(UpdatedWorkItemDTO update) + public async Task Update(UpdatedWorkItemDto update) { if (!_workItemRepository.Exist(update.Resource.WorkItemId).Result) await Create(update.Resource.WorkItemId, update.Resource.Revision.Fields); @@ -112,7 +112,7 @@ public async Task Update(UpdatedWorkItemDTO update) await _workItemRepository.SaveChangesAsync(); } - public async Task Delete(DeleteWorkItemDTO delete) + public async Task Delete(DeleteWorkItemDto delete) { if (!_workItemRepository.Exist(delete.Resource.Id).Result) await Create(delete.Resource.Id, delete.Resource.Fields); @@ -143,7 +143,7 @@ public async Task Delete(DeleteWorkItemDTO delete) await _workItemRepository.SaveChangesAsync(); } - public async Task Restore(RestoreWorkItemDTO restore) + public async Task Restore(RestoreWorkItemDto restore) { if (!_workItemRepository.Exist(restore.Resource.Id).Result) await Create(restore.Resource.Id, restore.Resource.Fields); @@ -174,13 +174,13 @@ public async Task Restore(RestoreWorkItemDTO restore) await _workItemRepository.SaveChangesAsync(); } - public async Task GetByWorkItemId(string workItemId) + public async Task GetByWorkItemId(string workItemId) { var workItem = await _workItemRepository.GetByWorkItemId(workItemId); if (workItem is null) return null; - return _workItemAdapter.ToWorkItemDTO(workItem); + return _workItemAdapter.ToWorkItemDto(workItem); } #region Support Methods @@ -226,7 +226,7 @@ public WorkItemChange ToWorkItemChange( return new WorkItemChange(workItemId, changedBy.ExtractEmail(), iterationPath, newDate, newState, oldState, oldDate); } - public void AddWorkItemChange(WorkItem workItem, CreateWorkItemDTO create) + public void AddWorkItemChange(WorkItem workItem, CreateWorkItemDto create) { var workItemChange = ToWorkItemChange(workItem.Id, create.Resource.Fields.ChangedBy, @@ -240,7 +240,7 @@ public void AddWorkItemChange(WorkItem workItem, CreateWorkItemDTO create) workItem.AddWorkItemChange(workItemChange); } - public void AddWorkItemChange(WorkItem workItem, UpdatedWorkItemDTO update) + public void AddWorkItemChange(WorkItem workItem, UpdatedWorkItemDto update) { if (update.Resource.Fields.State is null) return; if (update.Resource.Fields.StateChangeDate is null) return; diff --git a/tests/AzureDevopsTracker.Tests/AzureDevopsTracker.Tests.csproj b/tests/AzureDevopsTracker.Tests/AzureDevopsTracker.Tests.csproj index 97fe960..bb3bd0a 100644 --- a/tests/AzureDevopsTracker.Tests/AzureDevopsTracker.Tests.csproj +++ b/tests/AzureDevopsTracker.Tests/AzureDevopsTracker.Tests.csproj @@ -9,10 +9,14 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all