mirror of
				https://github.com/zitadel/zitadel.git
				synced 2025-10-25 01:09:15 +00:00 
			
		
		
		
	 cc3ec1e2a7
			
		
	
	cc3ec1e2a7
	
	
	
		
			
			# Which Problems Are Solved The current v3alpha actions APIs don't exactly adhere to the [new resources API design](https://zitadel.com/docs/apis/v3#standard-resources). # How the Problems Are Solved - **Breaking**: The current v3alpha actions APIs are removed. This is breaking. - **Resource Namespace**: New v3alpha actions APIs for targets and executions are added under the namespace /resources. - **Feature Flag**: New v3alpha actions APIs still have to be activated using the actions feature flag - **Reduced Executions Overhead**: Executions are managed similar to settings according to the new API design: an empty list of targets basically makes an execution a Noop. So a single method, SetExecution is enough to cover all use cases. Noop executions are not returned in future search requests. - **Compatibility**: The executions created with previous v3alpha APIs are still available to be managed with the new executions API. # Additional Changes - Removed integration tests which test executions but rely on readable targets. They are added again with #8169 # Additional Context Closes #8168
		
			
				
	
	
		
			230 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package action
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/muhlemmer/gu"
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 	"google.golang.org/protobuf/types/known/durationpb"
 | |
| 
 | |
| 	"github.com/zitadel/zitadel/internal/command"
 | |
| 	"github.com/zitadel/zitadel/internal/domain"
 | |
| 	action "github.com/zitadel/zitadel/pkg/grpc/resources/action/v3alpha"
 | |
| )
 | |
| 
 | |
| func Test_createTargetToCommand(t *testing.T) {
 | |
| 	type args struct {
 | |
| 		req *action.Target
 | |
| 	}
 | |
| 	tests := []struct {
 | |
| 		name string
 | |
| 		args args
 | |
| 		want *command.AddTarget
 | |
| 	}{
 | |
| 		{
 | |
| 			name: "nil",
 | |
| 			args: args{nil},
 | |
| 			want: &command.AddTarget{
 | |
| 				Name:             "",
 | |
| 				Endpoint:         "",
 | |
| 				Timeout:          0,
 | |
| 				InterruptOnError: false,
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			name: "all fields (webhook)",
 | |
| 			args: args{&action.Target{
 | |
| 				Name:     "target 1",
 | |
| 				Endpoint: "https://example.com/hooks/1",
 | |
| 				TargetType: &action.Target_RestWebhook{
 | |
| 					RestWebhook: &action.SetRESTWebhook{},
 | |
| 				},
 | |
| 				Timeout: durationpb.New(10 * time.Second),
 | |
| 			}},
 | |
| 			want: &command.AddTarget{
 | |
| 				Name:             "target 1",
 | |
| 				TargetType:       domain.TargetTypeWebhook,
 | |
| 				Endpoint:         "https://example.com/hooks/1",
 | |
| 				Timeout:          10 * time.Second,
 | |
| 				InterruptOnError: false,
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			name: "all fields (async)",
 | |
| 			args: args{&action.Target{
 | |
| 				Name:     "target 1",
 | |
| 				Endpoint: "https://example.com/hooks/1",
 | |
| 				TargetType: &action.Target_RestAsync{
 | |
| 					RestAsync: &action.SetRESTAsync{},
 | |
| 				},
 | |
| 				Timeout: durationpb.New(10 * time.Second),
 | |
| 			}},
 | |
| 			want: &command.AddTarget{
 | |
| 				Name:             "target 1",
 | |
| 				TargetType:       domain.TargetTypeAsync,
 | |
| 				Endpoint:         "https://example.com/hooks/1",
 | |
| 				Timeout:          10 * time.Second,
 | |
| 				InterruptOnError: false,
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			name: "all fields (interrupting response)",
 | |
| 			args: args{&action.Target{
 | |
| 				Name:     "target 1",
 | |
| 				Endpoint: "https://example.com/hooks/1",
 | |
| 				TargetType: &action.Target_RestCall{
 | |
| 					RestCall: &action.SetRESTCall{
 | |
| 						InterruptOnError: true,
 | |
| 					},
 | |
| 				},
 | |
| 				Timeout: durationpb.New(10 * time.Second),
 | |
| 			}},
 | |
| 			want: &command.AddTarget{
 | |
| 				Name:             "target 1",
 | |
| 				TargetType:       domain.TargetTypeCall,
 | |
| 				Endpoint:         "https://example.com/hooks/1",
 | |
| 				Timeout:          10 * time.Second,
 | |
| 				InterruptOnError: true,
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 	for _, tt := range tests {
 | |
| 		t.Run(tt.name, func(t *testing.T) {
 | |
| 			got := createTargetToCommand(&action.CreateTargetRequest{Target: tt.args.req})
 | |
| 			assert.Equal(t, tt.want, got)
 | |
| 		})
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func Test_updateTargetToCommand(t *testing.T) {
 | |
| 	type args struct {
 | |
| 		req *action.PatchTarget
 | |
| 	}
 | |
| 	tests := []struct {
 | |
| 		name string
 | |
| 		args args
 | |
| 		want *command.ChangeTarget
 | |
| 	}{
 | |
| 		{
 | |
| 			name: "nil",
 | |
| 			args: args{nil},
 | |
| 			want: nil,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "all fields nil",
 | |
| 			args: args{&action.PatchTarget{
 | |
| 				Name:       nil,
 | |
| 				TargetType: nil,
 | |
| 				Timeout:    nil,
 | |
| 			}},
 | |
| 			want: &command.ChangeTarget{
 | |
| 				Name:             nil,
 | |
| 				TargetType:       nil,
 | |
| 				Endpoint:         nil,
 | |
| 				Timeout:          nil,
 | |
| 				InterruptOnError: nil,
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			name: "all fields empty",
 | |
| 			args: args{&action.PatchTarget{
 | |
| 				Name:       gu.Ptr(""),
 | |
| 				TargetType: nil,
 | |
| 				Timeout:    durationpb.New(0),
 | |
| 			}},
 | |
| 			want: &command.ChangeTarget{
 | |
| 				Name:             gu.Ptr(""),
 | |
| 				TargetType:       nil,
 | |
| 				Endpoint:         nil,
 | |
| 				Timeout:          gu.Ptr(0 * time.Second),
 | |
| 				InterruptOnError: nil,
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			name: "all fields (webhook)",
 | |
| 			args: args{&action.PatchTarget{
 | |
| 				Name:     gu.Ptr("target 1"),
 | |
| 				Endpoint: gu.Ptr("https://example.com/hooks/1"),
 | |
| 				TargetType: &action.PatchTarget_RestWebhook{
 | |
| 					RestWebhook: &action.SetRESTWebhook{
 | |
| 						InterruptOnError: false,
 | |
| 					},
 | |
| 				},
 | |
| 				Timeout: durationpb.New(10 * time.Second),
 | |
| 			}},
 | |
| 			want: &command.ChangeTarget{
 | |
| 				Name:             gu.Ptr("target 1"),
 | |
| 				TargetType:       gu.Ptr(domain.TargetTypeWebhook),
 | |
| 				Endpoint:         gu.Ptr("https://example.com/hooks/1"),
 | |
| 				Timeout:          gu.Ptr(10 * time.Second),
 | |
| 				InterruptOnError: gu.Ptr(false),
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			name: "all fields (webhook interrupt)",
 | |
| 			args: args{&action.PatchTarget{
 | |
| 				Name:     gu.Ptr("target 1"),
 | |
| 				Endpoint: gu.Ptr("https://example.com/hooks/1"),
 | |
| 				TargetType: &action.PatchTarget_RestWebhook{
 | |
| 					RestWebhook: &action.SetRESTWebhook{
 | |
| 						InterruptOnError: true,
 | |
| 					},
 | |
| 				},
 | |
| 				Timeout: durationpb.New(10 * time.Second),
 | |
| 			}},
 | |
| 			want: &command.ChangeTarget{
 | |
| 				Name:             gu.Ptr("target 1"),
 | |
| 				TargetType:       gu.Ptr(domain.TargetTypeWebhook),
 | |
| 				Endpoint:         gu.Ptr("https://example.com/hooks/1"),
 | |
| 				Timeout:          gu.Ptr(10 * time.Second),
 | |
| 				InterruptOnError: gu.Ptr(true),
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			name: "all fields (async)",
 | |
| 			args: args{&action.PatchTarget{
 | |
| 				Name:     gu.Ptr("target 1"),
 | |
| 				Endpoint: gu.Ptr("https://example.com/hooks/1"),
 | |
| 				TargetType: &action.PatchTarget_RestAsync{
 | |
| 					RestAsync: &action.SetRESTAsync{},
 | |
| 				},
 | |
| 				Timeout: durationpb.New(10 * time.Second),
 | |
| 			}},
 | |
| 			want: &command.ChangeTarget{
 | |
| 				Name:             gu.Ptr("target 1"),
 | |
| 				TargetType:       gu.Ptr(domain.TargetTypeAsync),
 | |
| 				Endpoint:         gu.Ptr("https://example.com/hooks/1"),
 | |
| 				Timeout:          gu.Ptr(10 * time.Second),
 | |
| 				InterruptOnError: gu.Ptr(false),
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			name: "all fields (interrupting response)",
 | |
| 			args: args{&action.PatchTarget{
 | |
| 				Name:     gu.Ptr("target 1"),
 | |
| 				Endpoint: gu.Ptr("https://example.com/hooks/1"),
 | |
| 				TargetType: &action.PatchTarget_RestCall{
 | |
| 					RestCall: &action.SetRESTCall{
 | |
| 						InterruptOnError: true,
 | |
| 					},
 | |
| 				},
 | |
| 				Timeout: durationpb.New(10 * time.Second),
 | |
| 			}},
 | |
| 			want: &command.ChangeTarget{
 | |
| 				Name:             gu.Ptr("target 1"),
 | |
| 				TargetType:       gu.Ptr(domain.TargetTypeCall),
 | |
| 				Endpoint:         gu.Ptr("https://example.com/hooks/1"),
 | |
| 				Timeout:          gu.Ptr(10 * time.Second),
 | |
| 				InterruptOnError: gu.Ptr(true),
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 	for _, tt := range tests {
 | |
| 		t.Run(tt.name, func(t *testing.T) {
 | |
| 			got := patchTargetToCommand(&action.PatchTargetRequest{Target: tt.args.req})
 | |
| 			assert.Equal(t, tt.want, got)
 | |
| 		})
 | |
| 	}
 | |
| }
 |