package notify import ( "context" "io" "log/slog" "net/http" "net/url" "time" ) // NtfyPriority exports ntfyPriority for testing. func NtfyPriority(priority string) string { return ntfyPriority(priority) } // SlackColor exports slackColor for testing. func SlackColor(priority string) string { return slackColor(priority) } // NewRequestForTest exports newRequest for testing. func NewRequestForTest( ctx context.Context, method string, target *url.URL, body io.Reader, ) *http.Request { return newRequest(ctx, method, target, body) } // NewTestService creates a Service suitable for unit testing. // It discards log output and uses the given transport. func NewTestService(transport http.RoundTripper) *Service { return &Service{ log: slog.New(slog.DiscardHandler), transport: transport, history: NewAlertHistory(), } } // SetNtfyURL sets the ntfy URL on a Service for testing. func (svc *Service) SetNtfyURL(u *url.URL) { svc.ntfyURL = u } // SetSlackWebhookURL sets the Slack webhook URL on a // Service for testing. func (svc *Service) SetSlackWebhookURL(u *url.URL) { svc.slackWebhookURL = u } // SetMattermostWebhookURL sets the Mattermost webhook URL on // a Service for testing. func (svc *Service) SetMattermostWebhookURL(u *url.URL) { svc.mattermostWebhookURL = u } // SendNtfy exports sendNtfy for testing. func (svc *Service) SendNtfy( ctx context.Context, topicURL *url.URL, title, message, priority string, ) error { return svc.sendNtfy(ctx, topicURL, title, message, priority) } // SendSlack exports sendSlack for testing. func (svc *Service) SendSlack( ctx context.Context, webhookURL *url.URL, title, message, priority string, ) error { return svc.sendSlack( ctx, webhookURL, title, message, priority, ) } // SetRetryConfig overrides the retry configuration for // testing. func (svc *Service) SetRetryConfig(cfg RetryConfig) { svc.retryConfig = cfg } // SetSleepFunc overrides the sleep function so tests can // eliminate real delays. func (svc *Service) SetSleepFunc( fn func(time.Duration) <-chan time.Time, ) { svc.sleepFn = fn } // DeliverWithRetry exports deliverWithRetry for testing. func (svc *Service) DeliverWithRetry( ctx context.Context, endpoint string, fn func(context.Context) error, ) error { return svc.deliverWithRetry(ctx, endpoint, fn) } // BackoffDuration exports RetryConfig.backoff for testing. func (rc RetryConfig) BackoffDuration(attempt int) time.Duration { return rc.defaults().backoff(attempt) }