package info

import (
	"context"
	"testing"

	"github.com/stretchr/testify/assert"
)

func Test_ActivityInfo(t *testing.T) {
	type args struct {
		ctx           context.Context
		ok            bool
		path          string
		method        string
		requestMethod string
	}
	type want struct {
		ok            bool
		path          string
		method        string
		requestMethod string
	}
	tests := []struct {
		name string
		args args
		want want
	}{
		{
			"already set",
			args{
				ctx: ctxWithActivityInfo(context.Background(), "set", "set", "set"),
				ok:  false,
			},
			want{
				ok:            true,
				path:          "set",
				method:        "set",
				requestMethod: "set",
			},
		},
		{
			"not set, empty",
			args{
				ctx: context.Background(),
				ok:  false,
			},
			want{
				ok: true,
			},
		},
		{
			"set empty",
			args{
				ctx: context.Background(),
				ok:  true,
			},
			want{
				ok: true,
			},
		},
		{
			"set",
			args{
				ctx:           context.Background(),
				ok:            true,
				path:          "set",
				method:        "set",
				requestMethod: "set",
			},
			want{
				ok:            true,
				path:          "set",
				method:        "set",
				requestMethod: "set",
			},
		},
		{
			"reset",
			args{
				ctx:           ctxWithActivityInfo(context.Background(), "set", "set", "set"),
				ok:            true,
				path:          "set2",
				method:        "set2",
				requestMethod: "set2",
			},
			want{
				ok:            true,
				path:          "set2",
				method:        "set2",
				requestMethod: "set2",
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			ai := &ActivityInfo{}
			ai.SetMethod(tt.args.method).SetPath(tt.args.path).SetRequestMethod(tt.args.requestMethod)
			if tt.args.ok {
				tt.args.ctx = ai.IntoContext(tt.args.ctx)
			}

			res := ActivityInfoFromContext(tt.args.ctx)
			if tt.want.ok {
				assert.NotNil(t, res)
			}
			assert.Equal(t, tt.want.path, res.Path)
			assert.Equal(t, tt.want.method, res.Method)
			assert.Equal(t, tt.want.requestMethod, res.RequestMethod)
		})
	}
}

func ctxWithActivityInfo(ctx context.Context, method, path, requestMethod string) context.Context {
	ai := &ActivityInfo{}
	return ai.SetPath(path).SetRequestMethod(requestMethod).SetMethod(method).IntoContext(ctx)
}