package config_test

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"google.golang.org/protobuf/proto"

	"github.com/pomerium/pomerium/config"
	"github.com/pomerium/pomerium/pkg/cryptutil"
	dcfg "github.com/pomerium/pomerium/pkg/derivecert/config"
)

func TestBuild(t *testing.T) {
	build := dcfg.NewBuilder()

	key := cryptutil.NewBase64Key()

	cfgA := config.Config{Options: &config.Options{SharedKey: key}}
	t.Run("no domain requested", func(t *testing.T) {
		require.NoError(t, build(&cfgA))
		assert.Empty(t, cfgA.DerivedCAPEM)
		assert.Empty(t, cfgA.DerivedCertificates)
	})

	cfgA.Options.DeriveInternalDomainCert = proto.String("example.com")
	t.Run("generate server cert", func(t *testing.T) {
		require.NoError(t, build(&cfgA))
		assert.NotEmpty(t, cfgA.DerivedCAPEM)
		assert.Len(t, cfgA.DerivedCertificates, 1)
	})

	cfgB := config.Config{Options: &config.Options{
		SharedKey:                key,
		DeriveInternalDomainCert: proto.String("example.com"),
	}}
	t.Run("caching", func(t *testing.T) {
		require.NoError(t, build(&cfgB))
		assert.Equal(t, cfgA.DerivedCAPEM, cfgB.DerivedCAPEM)
		assert.Equal(t, cfgA.DerivedCertificates[0].Certificate, cfgB.DerivedCertificates[0].Certificate)
	})

	t.Run("no domain requested after run", func(t *testing.T) {
		cfg := config.Config{Options: &config.Options{SharedKey: key}}
		require.NoError(t, build(&cfg))
		assert.Empty(t, cfg.DerivedCAPEM)
		assert.Empty(t, cfg.DerivedCertificates)
	})

	cfgB.Options.DeriveInternalDomainCert = proto.String("example2.com")
	t.Run("ca caching", func(t *testing.T) {
		require.NoError(t, build(&cfgB))
		assert.Equal(t, cfgA.DerivedCAPEM, cfgB.DerivedCAPEM)
		assert.NotEqual(t, cfgA.DerivedCertificates[0].Certificate, cfgB.DerivedCertificates[0].Certificate)
	})
}