Changes
2 changed files (+223/-2)
-
-
@@ -284,7 +284,13 @@ }return connect.NewResponse(&workspaceV2.CreateUserResponse{ Result: &workspaceV2.CreateUserResponse_Ok{ Ok: nil, Ok: &workspaceV2.User{ Id: &workspaceV2.UserID{ Value: proto.String(id.String()), }, Name: proto.String(name), DisplayName: proto.String(displayName), }, }, }), nil }
-
-
-
@@ -26,7 +26,7 @@_ "modernc.org/sqlite" ) func TestRejectsInvalidAdminCreationPassword(t *testing.T) { func setup(t *testing.T) *memhttp.Server { logger := slog.New(slog.NewTextHandler(io.Discard, nil)) db, err := sql.Open("sqlite", ":memory:") if err != nil {
-
@@ -46,6 +46,221 @@ server, err := memhttp.New(services.Mux(core))if err != nil { t.Fatal(err) } return server } func TestCreatesInitialAdmin(t *testing.T) { server := setup(t) client := v2connect.NewWorkspaceServiceClient( server.Client(), server.URL(), ) res, err := client.CreateUser( context.Background(), connect.NewRequest(&workspaceV2.CreateUserRequest{ Name: proto.String("alice"), DisplayName: proto.String("Alice"), Password: proto.String("Alice's password"), InitialAdminPassword: proto.String("initial_admin_password"), }), ) if err != nil { t.Fatal(err) } v, ok := res.Msg.Result.(*workspaceV2.CreateUserResponse_Ok) if !ok { typeName := reflect.Indirect(reflect.ValueOf(res.Msg.Result)) t.Errorf("Expected ok, got %s", typeName.Type().Name()) } if v.Ok.GetName() != "alice" { t.Errorf("Expected name=alice, got %s", *v.Ok.Name) } if v.Ok.GetDisplayName() != "Alice" { t.Errorf("Expected display_name=Alice, got %s", *v.Ok.DisplayName) } if v.Ok.Id.GetValue() == "" { t.Error("Expected ID, got empty value") } loginRes, err := client.Login( context.Background(), connect.NewRequest(&workspaceV2.LoginRequest{ Name: proto.String("alice"), Password: proto.String("Alice's password"), }), ) if err != nil { t.Fatal(err) } login, ok := loginRes.Msg.Result.(*workspaceV2.LoginResponse_Ok) if !ok { typeName := reflect.Indirect(reflect.ValueOf(loginRes.Msg.Result)) t.Errorf("Expected ok, got %s", typeName.Type().Name()) } if login.Ok.Id.GetValue() != v.Ok.Id.GetValue() { t.Errorf( "CreateUserResponse.ok.id.value = %s, LoginResponse.ok.id.value = %s", v.Ok.Id.GetValue(), login.Ok.Id.GetValue(), ) } } func TestSetNameToDisplayName(t *testing.T) { server := setup(t) client := v2connect.NewWorkspaceServiceClient( server.Client(), server.URL(), ) res, err := client.CreateUser( context.Background(), connect.NewRequest(&workspaceV2.CreateUserRequest{ Name: proto.String("alice"), Password: proto.String("Alice's password"), InitialAdminPassword: proto.String("initial_admin_password"), }), ) if err != nil { t.Fatal(err) } v, ok := res.Msg.Result.(*workspaceV2.CreateUserResponse_Ok) if !ok { typeName := reflect.Indirect(reflect.ValueOf(res.Msg.Result)) t.Errorf("Expected ok, got %s", typeName.Type().Name()) } if v.Ok.GetDisplayName() != "alice" { t.Errorf("Expected display_name=alice, got %s", *v.Ok.DisplayName) } } func TestRejectsSubsequentCreationUsingCreationPassword(t *testing.T) { server := setup(t) client := v2connect.NewWorkspaceServiceClient( server.Client(), server.URL(), ) aliceRes, err := client.CreateUser( context.Background(), connect.NewRequest(&workspaceV2.CreateUserRequest{ Name: proto.String("alice"), DisplayName: proto.String("Alice"), Password: proto.String("Alice's password"), InitialAdminPassword: proto.String("initial_admin_password"), }), ) if err != nil { t.Fatal(err) } alice, ok := aliceRes.Msg.Result.(*workspaceV2.CreateUserResponse_Ok) if !ok { typeName := reflect.Indirect(reflect.ValueOf(aliceRes.Msg.Result)) t.Errorf("Expected ok, got %s", typeName.Type().Name()) } if alice.Ok.GetName() != "alice" { t.Errorf("Expected name=alice, got %s", *alice.Ok.Name) } bobRes, err := client.CreateUser( context.Background(), connect.NewRequest(&workspaceV2.CreateUserRequest{ Name: proto.String("bob"), DisplayName: proto.String("Bob"), Password: proto.String("Bob's password"), InitialAdminPassword: proto.String("initial_admin_password"), }), ) if err != nil { t.Fatal(err) } _, ok = bobRes.Msg.Result.(*workspaceV2.CreateUserResponse_AuthenticationError) if !ok { typeName := reflect.Indirect(reflect.ValueOf(bobRes.Msg.Result)) t.Errorf("Expected authentication_error, got %s", typeName.Type().Name()) } } func TestRejectsEmptyName(t *testing.T) { server := setup(t) client := v2connect.NewWorkspaceServiceClient( server.Client(), server.URL(), ) res, err := client.CreateUser( context.Background(), connect.NewRequest(&workspaceV2.CreateUserRequest{ DisplayName: proto.String("Alice"), Password: proto.String("Alice's password"), InitialAdminPassword: proto.String("initial_admin_password"), }), ) if err != nil { t.Fatal(err) } v, ok := res.Msg.Result.(*workspaceV2.CreateUserResponse_MissingFieldError) if !ok { typeName := reflect.Indirect(reflect.ValueOf(res.Msg.Result)) t.Errorf("Expected missing_field_error, got %s", typeName.Type().Name()) } if v.MissingFieldError.GetPath() != "name" { t.Errorf("Expected path=name, got %s", v.MissingFieldError.GetPath()) } } func TestRejectsEmptyPassword(t *testing.T) { server := setup(t) client := v2connect.NewWorkspaceServiceClient( server.Client(), server.URL(), ) res, err := client.CreateUser( context.Background(), connect.NewRequest(&workspaceV2.CreateUserRequest{ Name: proto.String("alice"), DisplayName: proto.String("Alice"), InitialAdminPassword: proto.String("initial_admin_password"), }), ) if err != nil { t.Fatal(err) } v, ok := res.Msg.Result.(*workspaceV2.CreateUserResponse_MissingFieldError) if !ok { typeName := reflect.Indirect(reflect.ValueOf(res.Msg.Result)) t.Errorf("Expected missing_field_error, got %s", typeName.Type().Name()) } if v.MissingFieldError.GetPath() != "password" { t.Errorf("Expected path=password, got %s", v.MissingFieldError.GetPath()) } } func TestRejectsInvalidAdminCreationPassword(t *testing.T) { server := setup(t) client := v2connect.NewWorkspaceServiceClient( server.Client(),
-