package compatibility

import (
	"reflect"
	"testing"

	runtimev1 "github.com/pingcap-inc/nexuscrm-contract/wire-go/gen/runtime/v1"
	"google.golang.org/protobuf/reflect/protoreflect"
)

func TestSessionLifecycleWireContainsNoRawCredentials(t *testing.T) {
	create := (&runtimev1.CreateSessionRequest{}).ProtoReflect().Descriptor()
	assertFieldNames(t, create.Fields(), []protoreflect.Name{
		"app_installation_id", "method", "application_client_id", "requested_scope",
		"federated_provider_id", "source_address", "user_agent", "issue_control_proof",
	})
	read := (&runtimev1.ReadSessionRequest{}).ProtoReflect().Descriptor()
	assertFieldNames(t, read.Fields(), []protoreflect.Name{"document_policy", "app_installation_id", "allow_renewal", "use_control_proof"})
	assertFieldNames(t, (&runtimev1.SessionDocumentPolicyRequest{}).ProtoReflect().Descriptor().Fields(), []protoreflect.Name{"route_family_prefix", "link_routes"})
	assertFieldNames(t, (&runtimev1.SessionDocumentLinkRoute{}).ProtoReflect().Descriptor().Fields(), []protoreflect.Name{"link", "method", "path"})
	assertFieldNames(t, (&runtimev1.SessionDocumentPolicy{}).ProtoReflect().Descriptor().Fields(), []protoreflect.Name{"restricted", "allowed_links", "hourly_limit", "daily_limit"})
	revoke := (&runtimev1.RevokeSessionRequest{}).ProtoReflect().Descriptor()
	assertFieldNames(t, revoke.Fields(), []protoreflect.Name{"app_installation_id", "use_control_proof"})
	for _, message := range []protoreflect.MessageDescriptor{create, read, revoke} {
		for _, forbidden := range []protoreflect.Name{
			"username", "password", "client_secret", "id_token", "access_token", "bearer", "control_proof",
		} {
			if message.Fields().ByName(forbidden) != nil {
				t.Fatalf("raw credential %q entered %s", forbidden, message.FullName())
			}
		}
	}

	service := (&runtimev1.CreateSessionRequest{}).ProtoReflect().Descriptor().ParentFile().Services().ByName("SessionLifecycleService")
	if service == nil {
		t.Fatal("SessionLifecycleService is absent")
	}
	got := make([]protoreflect.Name, service.Methods().Len())
	for index := range service.Methods().Len() {
		got[index] = service.Methods().Get(index).Name()
	}
	if want := []protoreflect.Name{"CreateSession", "ReadSession", "RevokeSession"}; !reflect.DeepEqual(got, want) {
		t.Fatalf("methods = %v, want %v", got, want)
	}
}
