auth-ui: add e2e tests

Change-Id: Ic8f2f9e032d24eed2d4fd824dcfc26c59d7d915e
diff --git a/core/auth/ui/e2e/config.go b/core/auth/ui/e2e/config.go
new file mode 100644
index 0000000..010b3f4
--- /dev/null
+++ b/core/auth/ui/e2e/config.go
@@ -0,0 +1,78 @@
+package e2e
+
+import (
+	"bytes"
+	"crypto/rand"
+	"encoding/hex"
+	"fmt"
+	"os"
+	"path/filepath"
+	"strings"
+	"text/template"
+)
+
+type fixtureValues struct {
+	KratosPublicURL  string
+	KratosAdminURL   string
+	KratosPublicPort int
+	KratosAdminPort  int
+	HydraPublicURL   string
+	HydraAdminURL    string
+	HydraPublicPort  int
+	HydraAdminPort   int
+	UIURL            string
+	SchemaURL        string
+	SMTPPort         int
+	CookieSecret     string
+	CipherSecret     string
+	HydraSecret      string
+}
+
+func renderFixtures(repo, configDir string, values fixtureValues) error {
+	if err := os.MkdirAll(configDir, 0o755); err != nil {
+		return err
+	}
+	schemaSource := filepath.Join(repo, "e2e", "testdata", "identity.schema.json")
+	schemaDestination := filepath.Join(configDir, "identity.schema.json")
+	data, err := os.ReadFile(schemaSource)
+	if err != nil {
+		return err
+	}
+	if err := os.WriteFile(schemaDestination, data, 0o600); err != nil {
+		return err
+	}
+	values.SchemaURL = "file://" + filepath.ToSlash(schemaDestination)
+	for _, name := range []string{"kratos.yml", "hydra.yml"} {
+		if err := renderFixture(filepath.Join(repo, "e2e", "testdata", name+".tmpl"), filepath.Join(configDir, name), values); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func renderFixture(source, destination string, values fixtureValues) error {
+	data, err := os.ReadFile(source)
+	if err != nil {
+		return err
+	}
+	tmpl, err := template.New(filepath.Base(source)).Option("missingkey=error").Parse(string(data))
+	if err != nil {
+		return err
+	}
+	var rendered bytes.Buffer
+	if err := tmpl.Execute(&rendered, values); err != nil {
+		return err
+	}
+	if strings.Contains(rendered.String(), "{{") || strings.Contains(rendered.String(), "}}") {
+		return fmt.Errorf("unresolved template marker in %s", source)
+	}
+	return os.WriteFile(destination, rendered.Bytes(), 0o600)
+}
+
+func randomSecret(bytesCount int) (string, error) {
+	b := make([]byte, bytesCount)
+	if _, err := rand.Read(b); err != nil {
+		return "", err
+	}
+	return hex.EncodeToString(b), nil
+}