//go:build !sync
// +build !sync

package sync_test

import (
	"os"
	"testing"

	. "github.com/smartystreets/goconvey/convey"
	"gopkg.in/resty.v1"

	"zotregistry.io/zot/pkg/api"
	"zotregistry.io/zot/pkg/api/config"
	extconf "zotregistry.io/zot/pkg/extensions/config"
	syncconf "zotregistry.io/zot/pkg/extensions/config/sync"
	"zotregistry.io/zot/pkg/test"
)

func TestSyncExtension(t *testing.T) {
	Convey("Make a new controller", t, func() {
		conf := config.New()
		port := test.GetFreePort()

		baseURL := test.GetBaseURL(port)
		globalDir := t.TempDir()
		defaultValue := true

		logFile, err := os.CreateTemp(globalDir, "zot-log*.txt")
		So(err, ShouldBeNil)
		defer os.Remove(logFile.Name())

		conf.HTTP.Port = port
		conf.Storage.RootDirectory = globalDir
		conf.Storage.Commit = true
		conf.Extensions = &extconf.ExtensionConfig{}
		conf.Extensions.Sync = &syncconf.Config{
			Enable: &defaultValue,
		}
		conf.Log.Level = "warn"
		conf.Log.Output = logFile.Name()

		ctlr := api.NewController(conf)
		ctlrManager := test.NewControllerManager(ctlr)

		ctlrManager.StartAndWait(port)
		defer ctlrManager.StopServer()

		Convey("verify sync is skipped when binary doesn't include it", func() {
			// image
			resp, err := resty.R().
				Head(baseURL + "/v2/" + "invalid" + "/manifests/invalid:0.0.2")
			So(err, ShouldBeNil)
			So(resp, ShouldNotBeNil)

			// reference
			resp, err = resty.R().
				Head(baseURL + "/v2/" + "invalid" + "/manifests/sha256_digest.sig")
			So(err, ShouldBeNil)
			So(resp, ShouldNotBeNil)

			data, err := os.ReadFile(logFile.Name())
			So(err, ShouldBeNil)

			So(string(data), ShouldContainSubstring,
				"skipping enabling sync extension because given zot binary doesn't include "+
					"this feature,please build a binary that does so")
		})
	})
}
