mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-12 10:55:20 +02:00
5eb996c43c
* 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>
188 lines
6.6 KiB
Go
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" }
|
|
]
|
|
}
|
|
}`
|