mirror of
https://github.com/zitadel/zitadel.git
synced 2025-12-06 03:42:55 +00:00
feat: http provider signing key addition (#10641)
# Which Problems Are Solved
HTTP Request to HTTP providers for Email or SMS are not signed.
# How the Problems Are Solved
Add a Signing Key to the HTTP Provider resources, which is then used to
generate a header to sign the payload.
# Additional Changes
Additional tests for query side of the SMTP provider.
# Additional Context
Closes #10067
---------
Co-authored-by: Marco A. <marco@zitadel.com>
(cherry picked from commit 8909b9a2a6)
This commit is contained in:
committed by
Livio Spring
parent
d2d94ea088
commit
1a7cd6e1af
@@ -55,8 +55,9 @@ func (s *Server) AddEmailProviderHTTP(ctx context.Context, req *admin_pb.AddEmai
|
||||
return nil, err
|
||||
}
|
||||
return &admin_pb.AddEmailProviderHTTPResponse{
|
||||
Details: object.DomainToChangeDetailsPb(config.Details),
|
||||
Id: config.ID,
|
||||
Details: object.DomainToChangeDetailsPb(config.Details),
|
||||
Id: config.ID,
|
||||
SigningKey: config.SigningKey,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -66,7 +67,8 @@ func (s *Server) UpdateEmailProviderHTTP(ctx context.Context, req *admin_pb.Upda
|
||||
return nil, err
|
||||
}
|
||||
return &admin_pb.UpdateEmailProviderHTTPResponse{
|
||||
Details: object.DomainToChangeDetailsPb(config.Details),
|
||||
Details: object.DomainToChangeDetailsPb(config.Details),
|
||||
SigningKey: config.SigningKey,
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -68,7 +68,8 @@ func emailProviderToPb(config *query.SMTPConfig) settings_pb.EmailConfig {
|
||||
func httpToPb(http *query.HTTP) *settings_pb.EmailProvider_Http {
|
||||
return &settings_pb.EmailProvider_Http{
|
||||
Http: &settings_pb.EmailProviderHTTP{
|
||||
Endpoint: http.Endpoint,
|
||||
Endpoint: http.Endpoint,
|
||||
SigningKey: http.SigningKey,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -76,11 +77,12 @@ func httpToPb(http *query.HTTP) *settings_pb.EmailProvider_Http {
|
||||
func smtpToPb(config *query.SMTP) *settings_pb.EmailProvider_Smtp {
|
||||
return &settings_pb.EmailProvider_Smtp{
|
||||
Smtp: &settings_pb.EmailProviderSMTP{
|
||||
Tls: config.TLS,
|
||||
Host: config.Host,
|
||||
User: config.User,
|
||||
SenderAddress: config.SenderAddress,
|
||||
SenderName: config.SenderName,
|
||||
Tls: config.TLS,
|
||||
Host: config.Host,
|
||||
User: config.User,
|
||||
SenderAddress: config.SenderAddress,
|
||||
SenderName: config.SenderName,
|
||||
ReplyToAddress: config.ReplyToAddress,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -123,11 +125,14 @@ func addEmailProviderHTTPToConfig(ctx context.Context, req *admin_pb.AddEmailPro
|
||||
}
|
||||
|
||||
func updateEmailProviderHTTPToConfig(ctx context.Context, req *admin_pb.UpdateEmailProviderHTTPRequest) *command.ChangeSMTPConfigHTTP {
|
||||
// TODO handle expiration, currently only immediate expiration is supported
|
||||
expirationSigningKey := req.GetExpirationSigningKey() != nil
|
||||
return &command.ChangeSMTPConfigHTTP{
|
||||
ResourceOwner: authz.GetInstance(ctx).InstanceID(),
|
||||
ID: req.Id,
|
||||
Description: req.Description,
|
||||
Endpoint: req.Endpoint,
|
||||
ResourceOwner: authz.GetInstance(ctx).InstanceID(),
|
||||
ID: req.Id,
|
||||
Description: req.Description,
|
||||
Endpoint: req.Endpoint,
|
||||
ExpirationSigningKey: expirationSigningKey,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
554
internal/api/grpc/admin/email_converters_test.go
Normal file
554
internal/api/grpc/admin/email_converters_test.go
Normal file
@@ -0,0 +1,554 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"google.golang.org/protobuf/types/known/durationpb"
|
||||
"google.golang.org/protobuf/types/known/timestamppb"
|
||||
|
||||
"github.com/zitadel/zitadel/internal/api/authz"
|
||||
"github.com/zitadel/zitadel/internal/command"
|
||||
"github.com/zitadel/zitadel/internal/domain"
|
||||
"github.com/zitadel/zitadel/internal/query"
|
||||
admin_pb "github.com/zitadel/zitadel/pkg/grpc/admin"
|
||||
object_pb "github.com/zitadel/zitadel/pkg/grpc/object"
|
||||
settings_pb "github.com/zitadel/zitadel/pkg/grpc/settings"
|
||||
)
|
||||
|
||||
func Test_listEmailProvidersToModel(t *testing.T) {
|
||||
type args struct {
|
||||
req *admin_pb.ListEmailProvidersRequest
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *query.SMTPConfigsSearchQueries
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
req: &admin_pb.ListEmailProvidersRequest{
|
||||
Query: &object_pb.ListQuery{
|
||||
Offset: 100,
|
||||
Limit: 100,
|
||||
Asc: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
res: &query.SMTPConfigsSearchQueries{
|
||||
SearchRequest: query.SearchRequest{
|
||||
Offset: 100,
|
||||
Limit: 100,
|
||||
Asc: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := listEmailProvidersToModel(tt.args.req)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_emailProvidersToPb(t *testing.T) {
|
||||
type args struct {
|
||||
req []*query.SMTPConfig
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res []*settings_pb.EmailProvider
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
req: []*query.SMTPConfig{
|
||||
{
|
||||
CreationDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ChangeDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ResourceOwner: "resourceowner",
|
||||
AggregateID: "agg",
|
||||
ID: "id",
|
||||
Sequence: 1,
|
||||
Description: "description",
|
||||
SMTPConfig: &query.SMTP{
|
||||
TLS: true,
|
||||
SenderAddress: "sender",
|
||||
SenderName: "sendername",
|
||||
ReplyToAddress: "address",
|
||||
Host: "host",
|
||||
User: "user",
|
||||
},
|
||||
HTTPConfig: nil,
|
||||
State: 1,
|
||||
},
|
||||
{
|
||||
CreationDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ChangeDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ResourceOwner: "resourceowner",
|
||||
AggregateID: "agg",
|
||||
ID: "id",
|
||||
Sequence: 1,
|
||||
Description: "description",
|
||||
SMTPConfig: nil,
|
||||
HTTPConfig: &query.HTTP{
|
||||
Endpoint: "endpoint",
|
||||
SigningKey: "key",
|
||||
},
|
||||
State: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
res: []*settings_pb.EmailProvider{
|
||||
{
|
||||
Details: &object_pb.ObjectDetails{
|
||||
Sequence: 1,
|
||||
CreationDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ChangeDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ResourceOwner: "resourceowner",
|
||||
},
|
||||
Id: "id",
|
||||
State: 1,
|
||||
Description: "description",
|
||||
Config: &settings_pb.EmailProvider_Smtp{
|
||||
Smtp: &settings_pb.EmailProviderSMTP{
|
||||
SenderAddress: "sender",
|
||||
SenderName: "sendername",
|
||||
Tls: true,
|
||||
Host: "host",
|
||||
User: "user",
|
||||
ReplyToAddress: "address",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Details: &object_pb.ObjectDetails{
|
||||
Sequence: 1,
|
||||
CreationDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ChangeDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ResourceOwner: "resourceowner",
|
||||
},
|
||||
Id: "id",
|
||||
State: 1,
|
||||
Description: "description",
|
||||
Config: &settings_pb.EmailProvider_Http{
|
||||
Http: &settings_pb.EmailProviderHTTP{
|
||||
Endpoint: "endpoint",
|
||||
SigningKey: "key",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := emailProvidersToPb(tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_emailProviderToProviderPb(t *testing.T) {
|
||||
type args struct {
|
||||
req *query.SMTPConfig
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *settings_pb.EmailProvider
|
||||
}{
|
||||
{
|
||||
name: "all fields filled, smtp",
|
||||
args: args{
|
||||
req: &query.SMTPConfig{
|
||||
|
||||
CreationDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ChangeDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ResourceOwner: "resourceowner",
|
||||
AggregateID: "agg",
|
||||
ID: "id",
|
||||
Sequence: 1,
|
||||
Description: "description",
|
||||
SMTPConfig: &query.SMTP{
|
||||
TLS: true,
|
||||
SenderAddress: "sender",
|
||||
SenderName: "sendername",
|
||||
ReplyToAddress: "address",
|
||||
Host: "host",
|
||||
User: "user",
|
||||
},
|
||||
HTTPConfig: &query.HTTP{
|
||||
Endpoint: "endpoint",
|
||||
SigningKey: "key",
|
||||
},
|
||||
State: 1,
|
||||
},
|
||||
},
|
||||
res: &settings_pb.EmailProvider{
|
||||
Details: &object_pb.ObjectDetails{
|
||||
Sequence: 1,
|
||||
CreationDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ChangeDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ResourceOwner: "resourceowner",
|
||||
},
|
||||
Id: "id",
|
||||
State: 1,
|
||||
Description: "description",
|
||||
Config: &settings_pb.EmailProvider_Smtp{
|
||||
Smtp: &settings_pb.EmailProviderSMTP{
|
||||
SenderAddress: "sender",
|
||||
SenderName: "sendername",
|
||||
Tls: true,
|
||||
Host: "host",
|
||||
User: "user",
|
||||
ReplyToAddress: "address",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "all fields filled, http",
|
||||
args: args{
|
||||
req: &query.SMTPConfig{
|
||||
CreationDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ChangeDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ResourceOwner: "resourceowner",
|
||||
AggregateID: "agg",
|
||||
ID: "id",
|
||||
Sequence: 1,
|
||||
Description: "description",
|
||||
HTTPConfig: &query.HTTP{
|
||||
Endpoint: "endpoint",
|
||||
SigningKey: "key",
|
||||
},
|
||||
State: 1,
|
||||
},
|
||||
},
|
||||
res: &settings_pb.EmailProvider{
|
||||
Details: &object_pb.ObjectDetails{
|
||||
Sequence: 1,
|
||||
CreationDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ChangeDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ResourceOwner: "resourceowner",
|
||||
},
|
||||
Id: "id",
|
||||
State: 1,
|
||||
Description: "description",
|
||||
Config: &settings_pb.EmailProvider_Http{
|
||||
Http: &settings_pb.EmailProviderHTTP{
|
||||
Endpoint: "endpoint",
|
||||
SigningKey: "key",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := emailProviderToProviderPb(tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_emailProviderStateToPb(t *testing.T) {
|
||||
type args struct {
|
||||
req domain.SMTPConfigState
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res settings_pb.EmailProviderState
|
||||
}{
|
||||
{
|
||||
name: "unspecified",
|
||||
args: args{
|
||||
req: domain.SMTPConfigStateUnspecified,
|
||||
},
|
||||
res: settings_pb.EmailProviderState_EMAIL_PROVIDER_STATE_UNSPECIFIED,
|
||||
},
|
||||
{
|
||||
name: "removed",
|
||||
args: args{
|
||||
req: domain.SMTPConfigStateRemoved,
|
||||
},
|
||||
res: settings_pb.EmailProviderState_EMAIL_PROVIDER_STATE_UNSPECIFIED,
|
||||
},
|
||||
{
|
||||
name: "active",
|
||||
args: args{
|
||||
req: domain.SMTPConfigStateActive,
|
||||
},
|
||||
res: settings_pb.EmailProviderState_EMAIL_PROVIDER_ACTIVE,
|
||||
},
|
||||
{
|
||||
name: "inactive",
|
||||
args: args{
|
||||
req: domain.SMTPConfigStateInactive,
|
||||
},
|
||||
res: settings_pb.EmailProviderState_EMAIL_PROVIDER_INACTIVE,
|
||||
},
|
||||
{
|
||||
name: "default",
|
||||
args: args{
|
||||
req: 100,
|
||||
},
|
||||
res: settings_pb.EmailProviderState_EMAIL_PROVIDER_STATE_UNSPECIFIED,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := emailProviderStateToPb(tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_httpToPb(t *testing.T) {
|
||||
type args struct {
|
||||
req *query.HTTP
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *settings_pb.EmailProvider_Http
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
req: &query.HTTP{
|
||||
Endpoint: "endpoint",
|
||||
SigningKey: "key",
|
||||
},
|
||||
},
|
||||
res: &settings_pb.EmailProvider_Http{
|
||||
Http: &settings_pb.EmailProviderHTTP{
|
||||
Endpoint: "endpoint",
|
||||
SigningKey: "key",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := httpToPb(tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_smtpToPb(t *testing.T) {
|
||||
type args struct {
|
||||
req *query.SMTP
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *settings_pb.EmailProvider_Smtp
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
req: &query.SMTP{
|
||||
SenderAddress: "sender",
|
||||
SenderName: "sendername",
|
||||
TLS: true,
|
||||
Host: "host",
|
||||
User: "user",
|
||||
ReplyToAddress: "address",
|
||||
},
|
||||
},
|
||||
res: &settings_pb.EmailProvider_Smtp{
|
||||
Smtp: &settings_pb.EmailProviderSMTP{
|
||||
SenderAddress: "sender",
|
||||
SenderName: "sendername",
|
||||
Tls: true,
|
||||
Host: "host",
|
||||
User: "user",
|
||||
ReplyToAddress: "address",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := smtpToPb(tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_addEmailProviderSMTPToConfig(t *testing.T) {
|
||||
type args struct {
|
||||
ctx context.Context
|
||||
req *admin_pb.AddEmailProviderSMTPRequest
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *command.AddSMTPConfig
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
ctx: authz.WithInstanceID(context.Background(), "instance"),
|
||||
req: &admin_pb.AddEmailProviderSMTPRequest{
|
||||
SenderAddress: "sender",
|
||||
SenderName: "sendername",
|
||||
Tls: true,
|
||||
Host: "host",
|
||||
User: "user",
|
||||
Password: "password",
|
||||
ReplyToAddress: "address",
|
||||
Description: "description",
|
||||
},
|
||||
},
|
||||
res: &command.AddSMTPConfig{
|
||||
ResourceOwner: "instance",
|
||||
Description: "description",
|
||||
Host: "host",
|
||||
User: "user",
|
||||
Password: "password",
|
||||
Tls: true,
|
||||
From: "sender",
|
||||
FromName: "sendername",
|
||||
ReplyToAddress: "address",
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := addEmailProviderSMTPToConfig(tt.args.ctx, tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_updateEmailProviderSMTPToConfig(t *testing.T) {
|
||||
type args struct {
|
||||
ctx context.Context
|
||||
req *admin_pb.UpdateEmailProviderSMTPRequest
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *command.ChangeSMTPConfig
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
ctx: authz.WithInstanceID(context.Background(), "instance"),
|
||||
req: &admin_pb.UpdateEmailProviderSMTPRequest{
|
||||
SenderAddress: "sender",
|
||||
SenderName: "sendername",
|
||||
Tls: true,
|
||||
Host: "host",
|
||||
User: "user",
|
||||
ReplyToAddress: "address",
|
||||
Password: "password",
|
||||
Description: "description",
|
||||
Id: "id",
|
||||
},
|
||||
},
|
||||
res: &command.ChangeSMTPConfig{
|
||||
ResourceOwner: "instance",
|
||||
ID: "id",
|
||||
Description: "description",
|
||||
Host: "host",
|
||||
User: "user",
|
||||
Password: "password",
|
||||
Tls: true,
|
||||
From: "sender",
|
||||
FromName: "sendername",
|
||||
ReplyToAddress: "address",
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := updateEmailProviderSMTPToConfig(tt.args.ctx, tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_addEmailProviderHTTPToConfig(t *testing.T) {
|
||||
type args struct {
|
||||
ctx context.Context
|
||||
req *admin_pb.AddEmailProviderHTTPRequest
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *command.AddSMTPConfigHTTP
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
ctx: authz.WithInstanceID(context.Background(), "instance"),
|
||||
req: &admin_pb.AddEmailProviderHTTPRequest{
|
||||
Endpoint: "endpoint",
|
||||
Description: "description",
|
||||
},
|
||||
},
|
||||
res: &command.AddSMTPConfigHTTP{
|
||||
ResourceOwner: "instance",
|
||||
ID: "",
|
||||
Description: "description",
|
||||
Endpoint: "endpoint",
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := addEmailProviderHTTPToConfig(tt.args.ctx, tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_updateEmailProviderHTTPToConfig(t *testing.T) {
|
||||
type args struct {
|
||||
ctx context.Context
|
||||
req *admin_pb.UpdateEmailProviderHTTPRequest
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *command.ChangeSMTPConfigHTTP
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
ctx: authz.WithInstanceID(context.Background(), "instance"),
|
||||
req: &admin_pb.UpdateEmailProviderHTTPRequest{
|
||||
Id: "id",
|
||||
Endpoint: "endpoint",
|
||||
Description: "description",
|
||||
ExpirationSigningKey: durationpb.New(time.Second),
|
||||
},
|
||||
},
|
||||
res: &command.ChangeSMTPConfigHTTP{
|
||||
ResourceOwner: "instance",
|
||||
ID: "id",
|
||||
Description: "description",
|
||||
Endpoint: "endpoint",
|
||||
ExpirationSigningKey: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := updateEmailProviderHTTPToConfig(tt.args.ctx, tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -71,8 +71,9 @@ func (s *Server) AddSMSProviderHTTP(ctx context.Context, req *admin_pb.AddSMSPro
|
||||
return nil, err
|
||||
}
|
||||
return &admin_pb.AddSMSProviderHTTPResponse{
|
||||
Details: object.DomainToAddDetailsPb(smsConfig.Details),
|
||||
Id: smsConfig.ID,
|
||||
Details: object.DomainToAddDetailsPb(smsConfig.Details),
|
||||
Id: smsConfig.ID,
|
||||
SigningKey: smsConfig.SigningKey,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -82,7 +83,8 @@ func (s *Server) UpdateSMSProviderHTTP(ctx context.Context, req *admin_pb.Update
|
||||
return nil, err
|
||||
}
|
||||
return &admin_pb.UpdateSMSProviderHTTPResponse{
|
||||
Details: object.DomainToChangeDetailsPb(smsConfig.Details),
|
||||
Details: object.DomainToChangeDetailsPb(smsConfig.Details),
|
||||
SigningKey: smsConfig.SigningKey,
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -56,7 +56,8 @@ func SMSConfigToPb(config *query.SMSConfig) settings_pb.SMSConfig {
|
||||
func HTTPConfigToPb(http *query.HTTP) *settings_pb.SMSProvider_Http {
|
||||
return &settings_pb.SMSProvider_Http{
|
||||
Http: &settings_pb.HTTPConfig{
|
||||
Endpoint: http.Endpoint,
|
||||
Endpoint: http.Endpoint,
|
||||
SigningKey: http.SigningKey,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -73,6 +74,8 @@ func TwilioConfigToPb(twilio *query.Twilio) *settings_pb.SMSProvider_Twilio {
|
||||
|
||||
func smsStateToPb(state domain.SMSConfigState) settings_pb.SMSProviderConfigState {
|
||||
switch state {
|
||||
case domain.SMSConfigStateUnspecified, domain.SMSConfigStateRemoved:
|
||||
return settings_pb.SMSProviderConfigState_SMS_PROVIDER_CONFIG_INACTIVE
|
||||
case domain.SMSConfigStateInactive:
|
||||
return settings_pb.SMSProviderConfigState_SMS_PROVIDER_CONFIG_INACTIVE
|
||||
case domain.SMSConfigStateActive:
|
||||
@@ -113,10 +116,13 @@ func addSMSConfigHTTPToConfig(ctx context.Context, req *admin_pb.AddSMSProviderH
|
||||
}
|
||||
|
||||
func updateSMSConfigHTTPToConfig(ctx context.Context, req *admin_pb.UpdateSMSProviderHTTPRequest) *command.ChangeSMSHTTP {
|
||||
// TODO handle expiration, currently only immediate expiration is supported
|
||||
expirationSigningKey := req.GetExpirationSigningKey() != nil
|
||||
return &command.ChangeSMSHTTP{
|
||||
ResourceOwner: authz.GetInstance(ctx).InstanceID(),
|
||||
ID: req.Id,
|
||||
Description: gu.Ptr(req.Description),
|
||||
Endpoint: gu.Ptr(req.Endpoint),
|
||||
ResourceOwner: authz.GetInstance(ctx).InstanceID(),
|
||||
ID: req.Id,
|
||||
Description: gu.Ptr(req.Description),
|
||||
Endpoint: gu.Ptr(req.Endpoint),
|
||||
ExpirationSigningKey: expirationSigningKey,
|
||||
}
|
||||
}
|
||||
|
||||
520
internal/api/grpc/admin/sms_converters_test.go
Normal file
520
internal/api/grpc/admin/sms_converters_test.go
Normal file
@@ -0,0 +1,520 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/muhlemmer/gu"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"google.golang.org/protobuf/types/known/durationpb"
|
||||
"google.golang.org/protobuf/types/known/timestamppb"
|
||||
|
||||
"github.com/zitadel/zitadel/internal/api/authz"
|
||||
"github.com/zitadel/zitadel/internal/command"
|
||||
"github.com/zitadel/zitadel/internal/domain"
|
||||
"github.com/zitadel/zitadel/internal/query"
|
||||
admin_pb "github.com/zitadel/zitadel/pkg/grpc/admin"
|
||||
object_pb "github.com/zitadel/zitadel/pkg/grpc/object"
|
||||
settings_pb "github.com/zitadel/zitadel/pkg/grpc/settings"
|
||||
)
|
||||
|
||||
func Test_listSMSConfigsToModel(t *testing.T) {
|
||||
type args struct {
|
||||
req *admin_pb.ListSMSProvidersRequest
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *query.SMSConfigsSearchQueries
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
req: &admin_pb.ListSMSProvidersRequest{
|
||||
Query: &object_pb.ListQuery{
|
||||
Offset: 100,
|
||||
Limit: 100,
|
||||
Asc: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
res: &query.SMSConfigsSearchQueries{
|
||||
SearchRequest: query.SearchRequest{
|
||||
Offset: 100,
|
||||
Limit: 100,
|
||||
Asc: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := listSMSConfigsToModel(tt.args.req)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_SMSConfigsToPb(t *testing.T) {
|
||||
type args struct {
|
||||
req []*query.SMSConfig
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res []*settings_pb.SMSProvider
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
req: []*query.SMSConfig{
|
||||
{
|
||||
CreationDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ChangeDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ResourceOwner: "resourceowner",
|
||||
AggregateID: "agg",
|
||||
ID: "id",
|
||||
Sequence: 1,
|
||||
Description: "description",
|
||||
TwilioConfig: &query.Twilio{
|
||||
SID: "sid",
|
||||
Token: nil,
|
||||
SenderNumber: "sender",
|
||||
VerifyServiceSID: "verify",
|
||||
},
|
||||
State: 1,
|
||||
},
|
||||
{
|
||||
CreationDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ChangeDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ResourceOwner: "resourceowner",
|
||||
AggregateID: "agg",
|
||||
ID: "id",
|
||||
Sequence: 1,
|
||||
Description: "description",
|
||||
HTTPConfig: &query.HTTP{
|
||||
Endpoint: "endpoint",
|
||||
SigningKey: "key",
|
||||
},
|
||||
State: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
res: []*settings_pb.SMSProvider{
|
||||
{
|
||||
Details: &object_pb.ObjectDetails{
|
||||
Sequence: 1,
|
||||
CreationDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ChangeDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ResourceOwner: "resourceowner",
|
||||
},
|
||||
Id: "id",
|
||||
State: 1,
|
||||
Description: "description",
|
||||
Config: &settings_pb.SMSProvider_Twilio{
|
||||
Twilio: &settings_pb.TwilioConfig{
|
||||
Sid: "sid",
|
||||
SenderNumber: "sender",
|
||||
VerifyServiceSid: "verify",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Details: &object_pb.ObjectDetails{
|
||||
Sequence: 1,
|
||||
CreationDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ChangeDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ResourceOwner: "resourceowner",
|
||||
},
|
||||
Id: "id",
|
||||
State: 1,
|
||||
Description: "description",
|
||||
Config: &settings_pb.SMSProvider_Http{
|
||||
Http: &settings_pb.HTTPConfig{
|
||||
Endpoint: "endpoint",
|
||||
SigningKey: "key",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := SMSConfigsToPb(tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_SMSConfigToProviderPb(t *testing.T) {
|
||||
type args struct {
|
||||
req *query.SMSConfig
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *settings_pb.SMSProvider
|
||||
}{
|
||||
{
|
||||
name: "all fields filled, twilio",
|
||||
args: args{
|
||||
req: &query.SMSConfig{
|
||||
|
||||
CreationDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ChangeDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ResourceOwner: "resourceowner",
|
||||
AggregateID: "agg",
|
||||
ID: "id",
|
||||
Sequence: 1,
|
||||
Description: "description",
|
||||
TwilioConfig: &query.Twilio{
|
||||
SID: "sid",
|
||||
Token: nil,
|
||||
SenderNumber: "sender",
|
||||
VerifyServiceSID: "verify",
|
||||
},
|
||||
State: 1,
|
||||
},
|
||||
},
|
||||
res: &settings_pb.SMSProvider{
|
||||
Details: &object_pb.ObjectDetails{
|
||||
Sequence: 1,
|
||||
CreationDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ChangeDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ResourceOwner: "resourceowner",
|
||||
},
|
||||
Id: "id",
|
||||
State: 1,
|
||||
Description: "description",
|
||||
Config: &settings_pb.SMSProvider_Twilio{
|
||||
Twilio: &settings_pb.TwilioConfig{
|
||||
Sid: "sid",
|
||||
SenderNumber: "sender",
|
||||
VerifyServiceSid: "verify",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "all fields filled, http",
|
||||
args: args{
|
||||
req: &query.SMSConfig{
|
||||
CreationDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ChangeDate: time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
ResourceOwner: "resourceowner",
|
||||
AggregateID: "agg",
|
||||
ID: "id",
|
||||
Sequence: 1,
|
||||
Description: "description",
|
||||
HTTPConfig: &query.HTTP{
|
||||
Endpoint: "endpoint",
|
||||
SigningKey: "key",
|
||||
},
|
||||
State: 1,
|
||||
},
|
||||
},
|
||||
res: &settings_pb.SMSProvider{
|
||||
Details: &object_pb.ObjectDetails{
|
||||
Sequence: 1,
|
||||
CreationDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ChangeDate: timestamppb.New(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)),
|
||||
ResourceOwner: "resourceowner",
|
||||
},
|
||||
Id: "id",
|
||||
State: 1,
|
||||
Description: "description",
|
||||
Config: &settings_pb.SMSProvider_Http{
|
||||
Http: &settings_pb.HTTPConfig{
|
||||
Endpoint: "endpoint",
|
||||
SigningKey: "key",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := SMSConfigToProviderPb(tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_smsStateToPb(t *testing.T) {
|
||||
type args struct {
|
||||
req domain.SMSConfigState
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res settings_pb.SMSProviderConfigState
|
||||
}{
|
||||
{
|
||||
name: "unspecified",
|
||||
args: args{
|
||||
req: domain.SMSConfigStateUnspecified,
|
||||
},
|
||||
res: settings_pb.SMSProviderConfigState_SMS_PROVIDER_CONFIG_INACTIVE,
|
||||
},
|
||||
{
|
||||
name: "removed",
|
||||
args: args{
|
||||
req: domain.SMSConfigStateRemoved,
|
||||
},
|
||||
res: settings_pb.SMSProviderConfigState_SMS_PROVIDER_CONFIG_INACTIVE,
|
||||
},
|
||||
{
|
||||
name: "active",
|
||||
args: args{
|
||||
req: domain.SMSConfigStateActive,
|
||||
},
|
||||
res: settings_pb.SMSProviderConfigState_SMS_PROVIDER_CONFIG_ACTIVE,
|
||||
},
|
||||
{
|
||||
name: "inactive",
|
||||
args: args{
|
||||
req: domain.SMSConfigStateInactive,
|
||||
},
|
||||
res: settings_pb.SMSProviderConfigState_SMS_PROVIDER_CONFIG_INACTIVE,
|
||||
},
|
||||
{
|
||||
name: "default",
|
||||
args: args{
|
||||
req: 100,
|
||||
},
|
||||
res: settings_pb.SMSProviderConfigState_SMS_PROVIDER_CONFIG_INACTIVE,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := smsStateToPb(tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_HTTPConfigToPb(t *testing.T) {
|
||||
type args struct {
|
||||
req *query.HTTP
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *settings_pb.SMSProvider_Http
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
req: &query.HTTP{
|
||||
Endpoint: "endpoint",
|
||||
SigningKey: "key",
|
||||
},
|
||||
},
|
||||
res: &settings_pb.SMSProvider_Http{
|
||||
Http: &settings_pb.HTTPConfig{
|
||||
Endpoint: "endpoint",
|
||||
SigningKey: "key",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := HTTPConfigToPb(tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_TwilioConfigToPb(t *testing.T) {
|
||||
type args struct {
|
||||
req *query.Twilio
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *settings_pb.SMSProvider_Twilio
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
req: &query.Twilio{
|
||||
SID: "sid",
|
||||
SenderNumber: "sender",
|
||||
VerifyServiceSID: "verify",
|
||||
},
|
||||
},
|
||||
res: &settings_pb.SMSProvider_Twilio{
|
||||
Twilio: &settings_pb.TwilioConfig{
|
||||
Sid: "sid",
|
||||
SenderNumber: "sender",
|
||||
VerifyServiceSid: "verify",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := TwilioConfigToPb(tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_addSMSConfigTwilioToConfig(t *testing.T) {
|
||||
type args struct {
|
||||
ctx context.Context
|
||||
req *admin_pb.AddSMSProviderTwilioRequest
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *command.AddTwilioConfig
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
ctx: authz.WithInstanceID(context.Background(), "instance"),
|
||||
req: &admin_pb.AddSMSProviderTwilioRequest{
|
||||
Sid: "sid",
|
||||
Token: "token",
|
||||
SenderNumber: "sender",
|
||||
Description: "description",
|
||||
VerifyServiceSid: "verify",
|
||||
},
|
||||
},
|
||||
res: &command.AddTwilioConfig{
|
||||
ResourceOwner: "instance",
|
||||
ID: "",
|
||||
Description: "description",
|
||||
SID: "sid",
|
||||
Token: "token",
|
||||
SenderNumber: "sender",
|
||||
VerifyServiceSID: "verify",
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := addSMSConfigTwilioToConfig(tt.args.ctx, tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_updateSMSConfigTwilioToConfig(t *testing.T) {
|
||||
type args struct {
|
||||
ctx context.Context
|
||||
req *admin_pb.UpdateSMSProviderTwilioRequest
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *command.ChangeTwilioConfig
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
ctx: authz.WithInstanceID(context.Background(), "instance"),
|
||||
req: &admin_pb.UpdateSMSProviderTwilioRequest{
|
||||
Id: "id",
|
||||
Sid: "sid",
|
||||
SenderNumber: "sender",
|
||||
Description: "description",
|
||||
VerifyServiceSid: "verify",
|
||||
},
|
||||
},
|
||||
res: &command.ChangeTwilioConfig{
|
||||
ResourceOwner: "instance",
|
||||
ID: "id",
|
||||
Description: gu.Ptr("description"),
|
||||
SID: gu.Ptr("sid"),
|
||||
SenderNumber: gu.Ptr("sender"),
|
||||
VerifyServiceSID: gu.Ptr("verify"),
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := updateSMSConfigTwilioToConfig(tt.args.ctx, tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_addSMSConfigHTTPToConfig(t *testing.T) {
|
||||
type args struct {
|
||||
ctx context.Context
|
||||
req *admin_pb.AddSMSProviderHTTPRequest
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *command.AddSMSHTTP
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
ctx: authz.WithInstanceID(context.Background(), "instance"),
|
||||
req: &admin_pb.AddSMSProviderHTTPRequest{
|
||||
Endpoint: "endpoint",
|
||||
Description: "description",
|
||||
},
|
||||
},
|
||||
res: &command.AddSMSHTTP{
|
||||
ResourceOwner: "instance",
|
||||
ID: "",
|
||||
Description: "description",
|
||||
Endpoint: "endpoint",
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := addSMSConfigHTTPToConfig(tt.args.ctx, tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_updateSMSConfigHTTPToConfig(t *testing.T) {
|
||||
type args struct {
|
||||
ctx context.Context
|
||||
req *admin_pb.UpdateSMSProviderHTTPRequest
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res *command.ChangeSMSHTTP
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
ctx: authz.WithInstanceID(context.Background(), "instance"),
|
||||
req: &admin_pb.UpdateSMSProviderHTTPRequest{
|
||||
Id: "id",
|
||||
Endpoint: "endpoint",
|
||||
Description: "description",
|
||||
ExpirationSigningKey: durationpb.New(time.Second),
|
||||
},
|
||||
},
|
||||
res: &command.ChangeSMSHTTP{
|
||||
ResourceOwner: "instance",
|
||||
ID: "id",
|
||||
Description: gu.Ptr("description"),
|
||||
Endpoint: gu.Ptr("endpoint"),
|
||||
ExpirationSigningKey: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := updateSMSConfigHTTPToConfig(tt.args.ctx, tt.args.req)
|
||||
assert.Equal(t, tt.res, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
63
internal/api/grpc/object/converter_test.go
Normal file
63
internal/api/grpc/object/converter_test.go
Normal file
@@ -0,0 +1,63 @@
|
||||
package object
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
object_pb "github.com/zitadel/zitadel/pkg/grpc/object"
|
||||
)
|
||||
|
||||
func Test_ListQueryToModel(t *testing.T) {
|
||||
type args struct {
|
||||
req *object_pb.ListQuery
|
||||
}
|
||||
type res struct {
|
||||
offset, limit uint64
|
||||
asc bool
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
res res
|
||||
}{
|
||||
{
|
||||
name: "all fields filled",
|
||||
args: args{
|
||||
req: &object_pb.ListQuery{
|
||||
Offset: 100,
|
||||
Limit: 100,
|
||||
Asc: true,
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
offset: 100,
|
||||
limit: 100,
|
||||
asc: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "all fields empty",
|
||||
args: args{
|
||||
req: &object_pb.ListQuery{
|
||||
Offset: 0,
|
||||
Limit: 0,
|
||||
Asc: false,
|
||||
},
|
||||
},
|
||||
res: res{
|
||||
offset: 0,
|
||||
limit: 0,
|
||||
asc: false,
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
offset, limit, asc := ListQueryToModel(tt.args.req)
|
||||
assert.Equal(t, tt.res.offset, offset)
|
||||
assert.Equal(t, tt.res.limit, limit)
|
||||
assert.Equal(t, tt.res.asc, asc)
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user