package dockerversion

import (
	"context"
	"testing"

	"github.com/moby/moby/v2/pkg/useragent"
	"gotest.tools/v3/assert"
	is "gotest.tools/v3/assert/cmp"
)

func TestDockerUserAgent(t *testing.T) {
	tests := []struct {
		doc      string
		ctx      context.Context
		metadata []useragent.VersionInfo
		expected string
	}{
		{
			doc:      "daemon user-agent",
			ctx:      t.Context(),
			expected: getDaemonUserAgent(),
		},
		{
			doc: "daemon user-agent custom metadata",
			ctx: t.Context(),
			metadata: []useragent.VersionInfo{
				{Name: "hello", Version: "world"},
				{Name: "foo", Version: "bar"},
			},
			expected: getDaemonUserAgent() + ` hello/world foo/bar`,
		},
		{
			doc:      "daemon user-agent with upstream",
			ctx:      WithUpstreamUserAgent(t.Context(), "Magic-Client/1.2.3 (linux)"),
			expected: getDaemonUserAgent() + ` UpstreamClient(Magic-Client/1.2.3 \(linux\))`,
		},
		{
			doc: "daemon user-agent with upstream and custom metadata",
			ctx: WithUpstreamUserAgent(t.Context(), "Magic-Client/1.2.3 (linux)"),
			metadata: []useragent.VersionInfo{
				{Name: "hello", Version: "world"},
				{Name: "foo", Version: "bar"},
			},
			expected: getDaemonUserAgent() + ` hello/world foo/bar UpstreamClient(Magic-Client/1.2.3 \(linux\))`,
		},
		{
			doc:      "daemon user-agent with upstream special chars",
			ctx:      WithUpstreamUserAgent(t.Context(), `Magic-Client/1.2.3 (linux); \ test`),
			expected: getDaemonUserAgent() + ` UpstreamClient(Magic-Client/1.2.3 \(linux\)\; \\ test)`,
		},
		{
			doc:      "daemon user-agent with upstream control chars",
			ctx:      WithUpstreamUserAgent(t.Context(), "Magic-Client/1.2.3\r\nInjected: evil"),
			expected: getDaemonUserAgent() + ` UpstreamClient(Magic-Client/1.2.3Injected: evil)`,
		},
	}

	for _, tc := range tests {
		t.Run(tc.doc, func(t *testing.T) {
			assert.Check(t, is.Equal(DockerUserAgent(tc.ctx, tc.metadata...), tc.expected))
		})
	}
}