package sentrysetup import ( "errors" "fmt" "testing" "github.com/getsentry/sentry-go" "github.com/stretchr/testify/assert" "gitlab.com/unboundsoftware/apex-mocks" ) func TestSetupSentry(t *testing.T) { type args struct { releaseName string args SentryConfig } tests := []struct { name string args args init func(t *testing.T) func(sentry.ClientOptions) error wantErr assert.ErrorAssertionFunc wantLogged []string }{ { name: "disabled", args: args{ releaseName: "v1.0.0", args: SentryConfig{ DSN: "https://dsn.example.org/123", Environment: "dev", Disabled: true, }, }, init: nil, wantErr: assert.NoError, wantLogged: []string{"info: Sentry disabled, skipping setup"}, }, { name: "no environment", args: args{ releaseName: "v1.0.0", args: SentryConfig{ DSN: "https://dsn.example.org/123", Environment: "", Disabled: false, }, }, init: nil, wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { return assert.EqualError(t, err, "no Sentry environment supplied, exiting") }, wantLogged: []string{}, }, { name: "illegal environment", args: args{ releaseName: "v1.0.0", args: SentryConfig{ DSN: "https://dsn.example.org/123", Environment: "unknown", Disabled: false, }, }, init: nil, wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { return assert.EqualError(t, err, "illegal environment unknown") }, wantLogged: []string{}, }, { name: "error setting up Sentry", args: args{ releaseName: "v1.0.0", args: SentryConfig{ DSN: "https://dsn.example.org/123", Environment: "development", Disabled: false, }, }, init: func(t *testing.T) func(sentry.ClientOptions) error { return func(options sentry.ClientOptions) error { assert.Equal(t, sentry.ClientOptions{ Dsn: "https://dsn.example.org/123", Debug: true, Release: "v1.0.0", Environment: "development", }, options) return errors.New("error") } }, wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { return assert.EqualError(t, err, "sentry setup: error") }, wantLogged: []string{}, }, { name: "missing DSN for prod-like environment", args: args{ releaseName: "v1.0.0", args: SentryConfig{ DSN: "", Environment: "staging", Disabled: false, }, }, init: nil, wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { return assert.EqualError(t, err, "no DSN supplied for non-dev environment, exiting") }, wantLogged: []string{}, }, { name: "success", args: args{ releaseName: "v1.0.0", args: SentryConfig{ DSN: "https://dsn.example.org/123", Environment: "production", Disabled: false, }, }, init: func(t *testing.T) func(sentry.ClientOptions) error { return func(options sentry.ClientOptions) error { assert.Equal(t, sentry.ClientOptions{ Dsn: "https://dsn.example.org/123", Debug: false, EnableTracing: true, TracesSampleRate: 1, Release: "v1.0.0", Environment: "production", }, options) return nil } }, wantErr: assert.NoError, wantLogged: []string{"info: configured Sentry for env: production"}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { logger := apex.New() if tt.init == nil { sentryInit = sentry.Init } else { sentryInit = tt.init(t) } tt.wantErr(t, SetupSentry(logger, tt.args.releaseName, tt.args.args), fmt.Sprintf("SetupSentry(%v, %v, %v)", logger, tt.args.releaseName, tt.args.args)) logger.Check(t, tt.wantLogged) }) } }