// Copyright 2019 The Fuchsia 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 main

import (
	"context"
	"net/url"
	"path/filepath"
	"testing"

	buildbucketpb "go.chromium.org/luci/buildbucket/proto"
	"go.fuchsia.dev/infra/cmd/build_init/testbed"
)

// Integration tests for Execute.
func TestExecute(t *testing.T) {
	// At this commit, the infra/testproject has a subdirectory "infra/config/generated".
	// The file "infra/config/generated/bucket/example" exists.
	// The file "infra/config/generated/bucket/noexist" does not.
	commit := &buildbucketpb.GitilesCommit{
		Host:    "fuchsia.googlesource.com",
		Project: "infra/testproject",
		Id:      "866bc31d1227669adac893800df17a6a733a5e23",
	}

	tests := []struct {
		name         string
		build        *buildbucketpb.Build
		repoURL      *url.URL
		specPath     string
		expectedCode int
	}{
		{
			name: "Should ExitOk if the spec file exists",
			build: &buildbucketpb.Build{
				Builder: &buildbucketpb.BuilderID{
					// Project is unimportant.
					Bucket:  "bucket",
					Builder: "example",
				},
				Input: &buildbucketpb.Build_Input{
					GitilesCommit: commit,
				},
			},
			repoURL: &url.URL{
				Scheme: "https",
				Host:   "fuchsia.googlesource.com",
				Path:   "/infra/testproject",
			},
			specPath:     filepath.Join("infra", "config", "generated", "bucket", "example"),
			expectedCode: ExitOk,
		},
		{
			name: "Should ExtiFileNotFound if the spec is not found.",
			build: &buildbucketpb.Build{
				Builder: &buildbucketpb.BuilderID{
					Bucket:  "bucket",
					Builder: "noexist",
				},
				Input: &buildbucketpb.Build_Input{
					GitilesCommit: commit,
				},
			},
			repoURL: &url.URL{
				Scheme: "https",
				Host:   "fuchsia.googlesource.com",
				Path:   "/infra/testproject",
			},
			specPath:     filepath.Join("infra", "config", "generated", "bucket", "noexist"),
			expectedCode: ExitFileNotFound,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			tb := testbed.New(t)
			tb.Setup()
			defer tb.Teardown()

			code := Execute(context.Background(), tt.build, tt.repoURL, tt.specPath, "HEAD")
			if code != tt.expectedCode {
				t.Errorf("wanted exit code %d but got %d", tt.expectedCode, code)
			}
		})
	}
}
