1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-12 10:55:20 +02:00
sap-jenkins-library/cmd/ansSendEvent_test.go
Oliver Feldmann 810d197665
[ANS] Step implementation (#3764)
* Add ans implementation

* Remove todo comment

* Rename test function

Co-authored-by: Linda Siebert <39100394+LindaSieb@users.noreply.github.com>

* Better wording

Co-authored-by: Linda Siebert <39100394+LindaSieb@users.noreply.github.com>

* Add reading of response body function

* Use http pkg ReadResponseBody

* Check read error

* Better test case description

* Fix formatting

* Create own package for read response body

* Omit empty nested resource struct

* Separate Resource struct from Event struct

* Merge and unmarshall instead of only unmarshalling

* Improve status code error message

* Remove unchangeable event fields

* Separate event parts

* Change log level setter function

* Restructure ans send test

* Revert exporting readResponseBody function

Instead the code is duplicated in the xsuaa and ans package

* Add check correct ans setup request

* Add set options function for mocking

* Review fixes

* Correct function name

* Use strict unmarshalling

* Validate event

* Move functions

* Add documentation comments

* improve test

* Validate event

* Add logrus hook for ans

* Set defaults on new hook creation

* Fix log level on error

* Don't alter entry log level

* Set severity fatal on 'fatal error' log message

* Ensure that log entries don't affect each other

* Remove unnecessary correlationID

* Use file path instead of event template string

* Improve warning messages

* Add empty log message check

* Allow configuration from file and string

* Add sourceEventId to tags

* Change resourceType to Pipeline

* Use structured config approach

* Use new log level set function

* Check correct setup and return error

* Mock http requests

* Only send log level warning or higher

* Use new function name

* One-liner ifs

* Improve test name

* Fix tests

* Prevent double firing

* Reduce Fire test size

* Add error message to test

* Reduce newANSHook test size

* Further check error

* Rename to defaultEvent in hook struct

* Reduce ifs further

* Fix set error category test

The ansHook Fire test cannot run in parallel, as it would affect the
other tests that use the error category.

* Change function name to SetServiceKey

* Validate event

* Rename to eventTemplate in hook struct

* Move copy to event.go

* Fix function mix

* Remove unnecessary cleanup

* Remove parallel test

The translation fails now and again when parallel is on.

* Remove prefix test

* Remove unused copyEvent function

* Fix ifs

* Add docu comment

* Register ans hook from pkg

* register hook and setup event template seperately

* Exclusively read eventTemplate from environment

* setupEventTemplate tests

* adjust hook levels test

* sync tests- wlill still fail

* migrate TestANSHook_registerANSHook test

* fixes

* Add ans send event step

* Fix tests

* Add groovy wrapper

* Add groovy wrapper test

* Fix function names

* Reduce ifs

* Fix docu

* We always set the timestamp

* Validate event

* Test unknown field in json

* Make test list test

* Set all event fields as separate parameters

* Generate and fix code

* Review fixes

* Format test file

* Format go code

* Fix common steps tests

* Print event to console if verbose

Co-authored-by: Linda Siebert <39100394+LindaSieb@users.noreply.github.com>
Co-authored-by: Roland Stengel <r.stengel@sap.com>
2022-06-21 15:45:07 +02:00

130 lines
3.4 KiB
Go

package cmd
import (
"fmt"
"github.com/SAP/jenkins-library/pkg/ans"
"github.com/SAP/jenkins-library/pkg/xsuaa"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"testing"
)
const testTimestamp = 1651585103
func TestRunAnsSendEvent(t *testing.T) {
tests := []struct {
name string
config ansSendEventOptions
ansMock ansMock
wantErrMsg string
}{
{
name: "overwriting EventType",
config: defaultEventOptions(),
},
{
name: "bad service key",
config: ansSendEventOptions{AnsServiceKey: `{"forgot": "closing", "bracket": "json"`},
wantErrMsg: `error unmarshalling ANS serviceKey: unexpected end of JSON input`,
},
{
name: "invalid event json",
config: ansSendEventOptions{AnsServiceKey: goodServiceKey, Severity: "WRONG_SEVERITY"},
wantErrMsg: `Severity must be one of [INFO NOTICE WARNING ERROR FATAL]: event JSON failed the validation`,
},
{
name: "fail to send",
config: defaultEventOptions(),
ansMock: ansMock{failToSend: true},
wantErrMsg: `failed to send`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if err := runAnsSendEvent(&tt.config, &tt.ansMock); tt.wantErrMsg != "" {
assert.EqualError(t, err, tt.wantErrMsg)
} else {
require.NoError(t, err)
assert.Equal(t, "https://my.test.backend", tt.ansMock.testANS.URL)
assert.Equal(t, defaultXsuaa(), tt.ansMock.testANS.XSUAA)
assert.Equal(t, defaultEvent(), tt.ansMock.testEvent)
}
})
}
}
func defaultEventOptions() ansSendEventOptions {
return ansSendEventOptions{
AnsServiceKey: goodServiceKey,
EventType: "myEvent",
Severity: "INFO",
Category: "NOTIFICATION",
Subject: "testStep",
Body: "Call from Piper step: testStep",
Priority: 123,
Tags: map[string]interface{}{"myNumber": 456},
ResourceName: "myResourceName",
ResourceType: "myResourceType",
ResourceInstance: "myResourceInstance",
ResourceTags: map[string]interface{}{"myBoolean": true},
}
}
func defaultEvent() ans.Event {
return ans.Event{
EventType: "myEvent",
EventTimestamp: testTimestamp,
Severity: "INFO",
Category: "NOTIFICATION",
Subject: "testStep",
Body: "Call from Piper step: testStep",
Priority: 123,
Tags: map[string]interface{}{"myNumber": 456},
Resource: &ans.Resource{
ResourceName: "myResourceName",
ResourceType: "myResourceType",
ResourceInstance: "myResourceInstance",
Tags: map[string]interface{}{"myBoolean": true},
},
}
}
func defaultXsuaa() xsuaa.XSUAA {
return xsuaa.XSUAA{
OAuthURL: "https://my.test.oauth.provider",
ClientID: "myTestClientID",
ClientSecret: "super secret",
}
}
const goodServiceKey = `{
"url": "https://my.test.backend",
"client_id": "myTestClientID",
"client_secret": "super secret",
"oauth_url": "https://my.test.oauth.provider"
}`
type ansMock struct {
testANS ans.ANS
testEvent ans.Event
failToSend bool
}
func (am *ansMock) Send(event ans.Event) error {
if am.failToSend {
return fmt.Errorf("failed to send")
}
event.EventTimestamp = testTimestamp
am.testEvent = event
return nil
}
func (am ansMock) CheckCorrectSetup() error {
return fmt.Errorf("not implemented")
}
func (am *ansMock) SetServiceKey(serviceKey ans.ServiceKey) {
am.testANS.SetServiceKey(serviceKey)
}