1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-14 11:03:09 +02:00
sap-jenkins-library/pkg/sonar/componentService_test.go
Matthias Scudlik 5eb996c43c
sonarqube coverage: additional metrics (#3465)
* sonarqube coverage: additional metrics

* sonarExecuteScan: add lines of code and language distribution to sonarscan.json

* sonarExecuteScan: consider branch in componentService requests

* SonarQube: Do not omit empty values in SonarCoverage

* sonarExecuteScan: Add integration tests for ComponentService getLinesOfCode

* fix tests

* sonarExecuteScan: use pullRequest in componentService

Co-authored-by: I550025 <r.kloe@sap.com>
Co-authored-by: Marc Bormeth <marc.bormeth@sap.com>
2022-02-04 09:52:29 +01:00

188 lines
6.6 KiB
Go

package sonar
import (
"net/http"
"testing"
"github.com/jarcoal/httpmock"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
piperhttp "github.com/SAP/jenkins-library/pkg/http"
)
func TestComponentService(t *testing.T) {
testURL := "https://example.org"
t.Run("Code Coverage: success", func(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()
sender := &piperhttp.Client{}
sender.SetOptions(piperhttp.ClientOptions{MaxRetries: -1, UseDefaultTransport: true})
// add response handler
httpmock.RegisterResponder(http.MethodGet, testURL+"/api/"+EndpointMeasuresComponent+"", httpmock.NewStringResponder(http.StatusOK, responseCoverage))
// create service instance
serviceUnderTest := NewMeasuresComponentService(testURL, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, sender)
// test
cov, err := serviceUnderTest.GetCoverage()
// assert
assert.NoError(t, err)
assert.Equal(t, float32(80.7), cov.Coverage)
assert.Equal(t, float32(80.4), cov.LineCoverage)
assert.Equal(t, 121, cov.LinesToCover)
assert.Equal(t, 91, cov.UncoveredLines)
assert.Equal(t, float32(81), cov.BranchCoverage)
assert.Equal(t, 8, cov.BranchesToCover)
assert.Equal(t, 5, cov.UncoveredBranches)
assert.Equal(t, 1, httpmock.GetTotalCallCount(), "unexpected number of requests")
})
t.Run("Code Coverage: invalid metric value", func(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()
sender := &piperhttp.Client{}
sender.SetOptions(piperhttp.ClientOptions{MaxRetries: -1, UseDefaultTransport: true})
// add response handler
httpmock.RegisterResponder(http.MethodGet, testURL+"/api/"+EndpointMeasuresComponent+"", httpmock.NewStringResponder(http.StatusOK, responseCoverageInvalidValue))
// create service instance
serviceUnderTest := NewMeasuresComponentService(testURL, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, sender)
// test
cov, err := serviceUnderTest.GetCoverage()
// assert
assert.Error(t, err)
assert.Nil(t, cov)
assert.Equal(t, 1, httpmock.GetTotalCallCount(), "unexpected number of requests")
})
t.Run("Lines Of Code: success", func(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()
sender := &piperhttp.Client{}
sender.SetOptions(piperhttp.ClientOptions{MaxRetries: -1, UseDefaultTransport: true})
// add response handler
httpmock.RegisterResponder(http.MethodGet, testURL+"/api/"+EndpointMeasuresComponent+"", httpmock.NewStringResponder(http.StatusOK, responseLinesOfCode))
// create service instance
serviceUnderTest := NewMeasuresComponentService(testURL, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, sender)
// test
loc, err := serviceUnderTest.GetLinesOfCode()
// assert
assert.NoError(t, err)
assert.Equal(t, 19464, loc.Total)
for _, dist := range loc.LanguageDistribution {
switch dist.LanguageKey {
case "js":
assert.Equal(t, 1504, dist.LinesOfCode)
case "ts":
assert.Equal(t, 16623, dist.LinesOfCode)
case "web":
assert.Equal(t, 1337, dist.LinesOfCode)
}
}
assert.Equal(t, 1, httpmock.GetTotalCallCount(), "unexpected number of requests")
})
t.Run("Lines Of Code: invalid metric value", func(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()
sender := &piperhttp.Client{}
sender.SetOptions(piperhttp.ClientOptions{MaxRetries: -1, UseDefaultTransport: true})
// add response handler
httpmock.RegisterResponder(http.MethodGet, testURL+"/api/"+EndpointMeasuresComponent+"", httpmock.NewStringResponder(http.StatusOK, responseLinesOfCodeInvalidValue))
// create service instance
serviceUnderTest := NewMeasuresComponentService(testURL, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, sender)
// test
loc, err := serviceUnderTest.GetLinesOfCode()
// assert
assert.Error(t, err)
assert.Nil(t, loc)
assert.Equal(t, 1, httpmock.GetTotalCallCount(), "unexpected number of requests")
})
t.Run("Lines Of Code: no separator", func(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()
sender := &piperhttp.Client{}
sender.SetOptions(piperhttp.ClientOptions{MaxRetries: -1, UseDefaultTransport: true})
// add response handler
httpmock.RegisterResponder(http.MethodGet, testURL+"/api/"+EndpointMeasuresComponent+"", httpmock.NewStringResponder(http.StatusOK, responseLinesOfCodeNoSeparator))
// create service instance
serviceUnderTest := NewMeasuresComponentService(testURL, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, sender)
// test
loc, err := serviceUnderTest.GetLinesOfCode()
// assert
assert.Error(t, err)
assert.Nil(t, loc)
assert.Equal(t, 1, httpmock.GetTotalCallCount(), "unexpected number of requests")
})
}
const responseCoverage = `{
"component": {
"key": "com.sap.piper.test",
"name": "com.sap.piper.test",
"qualifier": "TRK",
"measures": [
{ "metric": "line_coverage", "value": "80.4", "bestValue": false },
{ "metric": "branch_coverage", "value": "81.0", "bestValue": false },
{ "metric": "coverage", "value": "80.7", "bestValue": false },
{ "metric": "extra_valie", "value": "42.7", "bestValue": false },
{ "metric": "lines_to_cover", "value": "121" },
{ "metric": "uncovered_lines", "value": "91", "bestValue": false },
{ "metric": "conditions_to_cover", "value": "8" },
{ "metric": "uncovered_conditions", "value": "5", "bestValue": false }
]
}
}`
const responseCoverageInvalidValue = `{
"component": {
"key": "com.sap.piper.test",
"name": "com.sap.piper.test",
"qualifier": "TRK",
"measures": [
{ "metric": "line_coverage", "value": "xyz", "bestValue": false },
{ "metric": "uncovered_conditions", "value": "abc", "bestValue": false }
]
}
}`
const responseLinesOfCode = `{
"component": {
"key": "com.sap.piper.test",
"name": "com.sap.piper.test",
"qualifier": "TRK",
"measures": [
{ "metric": "ncloc_language_distribution", "value": "js=1504;ts=16623;web=1337" },
{ "metric": "ncloc", "value": "19464" }
]
}
}`
const responseLinesOfCodeInvalidValue = `{
"component": {
"key": "com.sap.piper.test",
"name": "com.sap.piper.test",
"qualifier": "TRK",
"measures": [
{ "metric": "ncloc_language_distribution", "value": "js=15.04;ts=16623;web=1337" },
{ "metric": "ncloc", "value": "19464" }
]
}
}`
const responseLinesOfCodeNoSeparator = `{
"component": {
"key": "com.sap.piper.test",
"name": "com.sap.piper.test",
"qualifier": "TRK",
"measures": [
{ "metric": "ncloc_language_distribution", "value": "js15.04" },
{ "metric": "ncloc", "value": "19464" }
]
}
}`