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 TestIssueService(t *testing.T) {
	testURL := "https://example.org"
	t.Run("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/"+EndpointIssuesSearch+"", httpmock.NewStringResponder(http.StatusOK, responseIssueSearchCritical))
		// create service instance
		serviceUnderTest := NewIssuesService(testURL, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, sender)
		// test
		count, err := serviceUnderTest.GetNumberOfBlockerIssues()
		// assert
		assert.NoError(t, err)
		assert.Equal(t, 111, count)
		assert.Equal(t, 1, httpmock.GetTotalCallCount(), "unexpected number of requests")
	})
	t.Run("error", 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/"+EndpointIssuesSearch+"", httpmock.NewStringResponder(http.StatusNotFound, responseIssueSearchError))
		// create service instance
		serviceUnderTest := NewIssuesService(testURL, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, sender)
		// test
		count, err := serviceUnderTest.GetNumberOfCriticalIssues()
		// assert
		assert.Error(t, err)
		assert.Equal(t, -1, count)
		assert.Equal(t, 1, httpmock.GetTotalCallCount(), "unexpected number of requests")
	})
	t.Run("", 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/"+EndpointIssuesSearch+"", httpmock.NewStringResponder(http.StatusOK, responseIssueSearchCritical))
		// create service instance
		serviceUnderTest := NewIssuesService(testURL, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, sender)
		// test
		countMajor, err := serviceUnderTest.GetNumberOfMajorIssues()
		countMinor, err := serviceUnderTest.GetNumberOfMinorIssues()
		countInfo, err := serviceUnderTest.GetNumberOfInfoIssues()
		// assert
		assert.NoError(t, err)
		assert.Equal(t, 111, countMajor)
		assert.Equal(t, 111, countMinor)
		assert.Equal(t, 111, countInfo)
		assert.Equal(t, 3, httpmock.GetTotalCallCount(), "unexpected number of requests")
	})
}

const responseIssueSearchError = `{
  "errors": [
    {
      "msg": "At least one of the following parameters must be specified: organization, projects, projectKeys (deprecated), componentKeys, componentUuids (deprecated), assignees, issues"
    }
  ]
}`

const responseIssueSearchCritical = `{
  "total": 111,
  "p": 1,
  "ps": 1,
  "paging": {
    "pageIndex": 1,
    "pageSize": 1,
    "total": 111
  },
  "effortTotal": 1176,
  "debtTotal": 1176,
  "issues": [
    {
      "key": "AXW3MmCVOYWf3_DBLGvL",
      "rule": "go:S3776",
      "severity": "CRITICAL",
      "component": "SAP_jenkins-library:cmd/fortifyExecuteScan.go",
      "project": "SAP_jenkins-library",
      "line": 647,
      "hash": "a154a51bdb1502a2ac057a348d08e7f6",
      "textRange": {
        "startLine": 647,
        "endLine": 647,
        "startOffset": 5,
        "endOffset": 23
      },
      "flows": [
        {
          "locations": [
            {
              "component": "SAP_jenkins-library:cmd/fortifyExecuteScan.go",
              "textRange": {
                "startLine": 651,
                "endLine": 651,
                "startOffset": 1,
                "endOffset": 3
              },
              "msg": "+1"
            }
          ]
        }
      ],
      "status": "OPEN",
      "message": "Refactor this method to reduce its Cognitive Complexity from 16 to the 15 allowed.",
      "effort": "6min",
      "debt": "6min",
      "assignee": "CCFenner@github",
      "author": "33484802+olivernocon@users.noreply.github.com",
      "tags": [],
      "creationDate": "2020-11-11T11:06:04+0100",
      "updateDate": "2020-11-11T11:06:04+0100",
      "type": "CODE_SMELL",
      "organization": "sap-1"
    }
  ],
  "components": [
    {
      "organization": "sap-1",
      "key": "SAP_jenkins-library:cmd/fortifyExecuteScan.go",
      "uuid": "AXVKXJIlrkwsFznOfAie",
      "enabled": true,
      "qualifier": "FIL",
      "name": "fortifyExecuteScan.go",
      "longName": "cmd/fortifyExecuteScan.go",
      "path": "cmd/fortifyExecuteScan.go"
    },
    {
      "organization": "sap-1",
      "key": "SAP_jenkins-library",
      "uuid": "AXVFg_8dh6o1O3pu_MCx",
      "enabled": true,
      "qualifier": "TRK",
      "name": "jenkins-library",
      "longName": "jenkins-library"
    }
  ],
  "organizations": [
    {
      "key": "sap-1",
      "name": "SAP"
    }
  ],
  "facets": []
}`
