// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package postgres

import (
	"context"
	"errors"
	"testing"

	"github.com/google/go-cmp/cmp"
	"golang.org/x/pkgsite/internal"
	"golang.org/x/pkgsite/internal/derrors"
)

func TestGetActiveExperiments(t *testing.T) {
	defer ResetTestDB(testDB, t)
	ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
	defer cancel()

	experiment := &internal.Experiment{Name: "test-experiment", Description: "test-description"}
	if err := testDB.UpdateExperiment(ctx, experiment); !errors.Is(err, derrors.NotFound) {
		t.Fatalf("unexpected error when updating non-existent experiment: %v", err)
	}
	got, err := testDB.GetExperiments(ctx)
	if err != nil {
		t.Fatal(err)
	}
	if len(got) != 0 {
		t.Fatalf("got %d experiments; want = 0", len(got))
	}
	if err := testDB.InsertExperiment(ctx, experiment); err != nil {
		t.Fatalf("error inserting inactive experiment: %v", err)
	}
	got, err = testDB.GetExperiments(ctx)
	if err != nil {
		t.Fatal(err)
	}
	if len(got) != 1 {
		t.Fatalf("got %d experiments; want = 1", len(got))
	}

	experiment.Rollout = 50
	if err := testDB.UpdateExperiment(ctx, experiment); err != nil {
		t.Fatal(err)
	}
	got, err = testDB.GetExperiments(ctx)
	if err != nil {
		t.Fatal(err)
	}
	if len(got) != 1 {
		t.Fatalf("got = %d active experiments; want = 1", len(got))
	}
	if diff := cmp.Diff(experiment, got[0]); diff != "" {
		t.Fatalf("mismatch (-want +got):\n%s", diff)
	}

}

func TestCannotInsertRolloutGreaterThan100(t *testing.T) {
	defer ResetTestDB(testDB, t)
	ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
	defer cancel()

	experiment := &internal.Experiment{
		Name:        "test-rollout-greater-than-one",
		Rollout:     101,
		Description: "test-description",
	}
	// Test cannot insert feature with rollout > 100.
	if err := testDB.InsertExperiment(ctx, experiment); err == nil {
		t.Fatal(err)
	}

	experiment.Rollout = 100
	if err := testDB.InsertExperiment(ctx, experiment); err != nil {
		t.Fatal(err)
	}
	// Test cannot update feature rollout to > 1.
	experiment.Rollout = 101
	if err := testDB.UpdateExperiment(ctx, experiment); err == nil {
		t.Fatal(err)
	}
}
