/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
*/

package textmsg

import (
	"errors"

	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"
)

var _ = Describe("warn tests", func() {
	Describe("warn text functions with one arg", func() {
		It("returns correct warn text", func() {
			tests := []struct {
				name     string
				value    string
				function func(string) string
				want     string
			}{
				{"WarnTextBackupUnableGetReport", "TestBackup", WarnTextBackupUnableGetReport, "Unable to get report for backup TestBackup. Check if backup is active"},
			}
			for _, tt := range tests {
				Expect(tt.function(tt.value)).To(Equal(tt.want), tt.name)
			}
		})
	})

	Describe("warn text functions with error only", func() {
		It("returns correct warn text without environment values", func() {
			text := WarnTextHistoryStandbySyncFailed(errors.New("transport failed"))

			Expect(text).To(Equal("History db sync to standby coordinator failed; standby history may be stale: transport failed"))
			Expect(text).ToNot(ContainSubstring("PGPASSWORD"))
			Expect(text).ToNot(ContainSubstring("secret"))
		})
	})
})
