2021-10-29 16:11:47 +02:00
package projection
import (
"testing"
2022-04-27 01:01:45 +02:00
"github.com/zitadel/zitadel/internal/eventstore"
2023-10-19 12:19:10 +02:00
"github.com/zitadel/zitadel/internal/eventstore/handler/v2"
2022-04-27 01:01:45 +02:00
"github.com/zitadel/zitadel/internal/repository/instance"
"github.com/zitadel/zitadel/internal/repository/org"
2023-12-08 16:30:55 +02:00
"github.com/zitadel/zitadel/internal/zerrors"
2021-10-29 16:11:47 +02:00
)
func TestCustomTextProjection_reduces ( t * testing . T ) {
type args struct {
2022-01-03 09:19:07 +01:00
event func ( t * testing . T ) eventstore . Event
2021-10-29 16:11:47 +02:00
}
tests := [ ] struct {
name string
args args
2022-01-03 09:19:07 +01:00
reduce func ( event eventstore . Event ) ( * handler . Statement , error )
2021-10-29 16:11:47 +02:00
want wantReduce
} {
{
2022-11-10 11:59:33 +01:00
name : "org reduceSet" ,
2021-10-29 16:11:47 +02:00
args : args {
2023-10-19 12:19:10 +02:00
event : getEvent (
testEvent (
org . CustomTextSetEventType ,
org . AggregateType ,
[ ] byte ( ` {
2021-10-29 16:11:47 +02:00
"key" : "Text" ,
"language" : "en" ,
"template" : "InitCode" ,
"text" : "Test"
} ` ) ,
2023-10-19 12:19:10 +02:00
) , org . CustomTextSetEventMapper ) ,
2021-10-29 16:11:47 +02:00
} ,
2022-06-14 07:51:00 +02:00
reduce : ( & customTextProjection { } ) . reduceSet ,
2021-10-29 16:11:47 +02:00
want : wantReduce {
2023-10-19 12:19:10 +02:00
aggregateType : eventstore . AggregateType ( "org" ) ,
sequence : 15 ,
2021-10-29 16:11:47 +02:00
executer : & testExecuter {
executions : [ ] execution {
{
2024-02-22 18:25:47 +01:00
expectedStmt : "INSERT INTO projections.custom_texts2 (aggregate_id, instance_id, creation_date, change_date, sequence, is_default, template, language, key, text) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ON CONFLICT (instance_id, aggregate_id, template, key, language) DO UPDATE SET (creation_date, change_date, sequence, is_default, text) = (projections.custom_texts2.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.is_default, EXCLUDED.text)" ,
2021-10-29 16:11:47 +02:00
expectedArgs : [ ] interface { } {
"agg-id" ,
2022-03-23 09:02:39 +01:00
"instance-id" ,
2021-10-29 16:11:47 +02:00
anyArg { } ,
anyArg { } ,
uint64 ( 15 ) ,
false ,
"InitCode" ,
"en" ,
"Text" ,
"Test" ,
} ,
} ,
} ,
} ,
} ,
} ,
{
2022-11-10 11:59:33 +01:00
name : "org reduceRemoved" ,
2022-06-14 07:51:00 +02:00
reduce : ( & customTextProjection { } ) . reduceRemoved ,
2021-10-29 16:11:47 +02:00
args : args {
2023-10-19 12:19:10 +02:00
event : getEvent (
testEvent (
org . CustomTextRemovedEventType ,
org . AggregateType ,
[ ] byte ( ` {
2021-10-29 16:11:47 +02:00
"key" : "Text" ,
"language" : "en" ,
"template" : "InitCode"
} ` ) ,
2023-10-19 12:19:10 +02:00
) , org . CustomTextRemovedEventMapper ) ,
2021-10-29 16:11:47 +02:00
} ,
want : wantReduce {
2023-10-19 12:19:10 +02:00
aggregateType : eventstore . AggregateType ( "org" ) ,
sequence : 15 ,
2021-10-29 16:11:47 +02:00
executer : & testExecuter {
executions : [ ] execution {
{
2022-11-30 17:01:17 +01:00
expectedStmt : "DELETE FROM projections.custom_texts2 WHERE (aggregate_id = $1) AND (template = $2) AND (key = $3) AND (language = $4) AND (instance_id = $5)" ,
2021-10-29 16:11:47 +02:00
expectedArgs : [ ] interface { } {
"agg-id" ,
"InitCode" ,
"Text" ,
2021-12-16 15:21:37 +01:00
"en" ,
2022-11-10 11:59:33 +01:00
"instance-id" ,
2021-10-29 16:11:47 +02:00
} ,
} ,
} ,
} ,
} ,
} ,
{
2022-11-10 11:59:33 +01:00
name : "org reduceTemplateRemoved" ,
2022-06-14 07:51:00 +02:00
reduce : ( & customTextProjection { } ) . reduceTemplateRemoved ,
2021-10-29 16:11:47 +02:00
args : args {
2023-10-19 12:19:10 +02:00
event : getEvent (
testEvent (
org . CustomTextTemplateRemovedEventType ,
org . AggregateType ,
[ ] byte ( ` {
2021-10-29 16:11:47 +02:00
"key" : "Text" ,
"language" : "en" ,
"template" : "InitCode"
} ` ) ,
2023-10-19 12:19:10 +02:00
) , org . CustomTextTemplateRemovedEventMapper ) ,
2021-10-29 16:11:47 +02:00
} ,
want : wantReduce {
2023-10-19 12:19:10 +02:00
aggregateType : eventstore . AggregateType ( "org" ) ,
sequence : 15 ,
2021-10-29 16:11:47 +02:00
executer : & testExecuter {
executions : [ ] execution {
{
2022-11-30 17:01:17 +01:00
expectedStmt : "DELETE FROM projections.custom_texts2 WHERE (aggregate_id = $1) AND (template = $2) AND (language = $3) AND (instance_id = $4)" ,
2021-10-29 16:11:47 +02:00
expectedArgs : [ ] interface { } {
"agg-id" ,
"InitCode" ,
2021-12-17 09:31:39 +01:00
"en" ,
2022-11-10 11:59:33 +01:00
"instance-id" ,
2021-10-29 16:11:47 +02:00
} ,
} ,
} ,
} ,
} ,
} ,
2022-10-20 13:36:52 +01:00
{
2022-11-10 11:59:33 +01:00
name : "instance reduceInstanceRemoved" ,
2022-10-20 13:36:52 +01:00
args : args {
2023-10-19 12:19:10 +02:00
event : getEvent (
testEvent (
instance . InstanceRemovedEventType ,
instance . AggregateType ,
nil ,
) , instance . InstanceRemovedEventMapper ) ,
2022-10-20 13:36:52 +01:00
} ,
reduce : reduceInstanceRemovedHelper ( CustomTextInstanceIDCol ) ,
want : wantReduce {
2023-10-19 12:19:10 +02:00
aggregateType : eventstore . AggregateType ( "instance" ) ,
sequence : 15 ,
2022-10-20 13:36:52 +01:00
executer : & testExecuter {
executions : [ ] execution {
{
2022-11-30 17:01:17 +01:00
expectedStmt : "DELETE FROM projections.custom_texts2 WHERE (instance_id = $1)" ,
2022-10-20 13:36:52 +01:00
expectedArgs : [ ] interface { } {
"agg-id" ,
} ,
} ,
} ,
} ,
} ,
} ,
2021-10-29 16:11:47 +02:00
{
2022-11-10 11:59:33 +01:00
name : "instance reduceAdded" ,
2022-06-14 07:51:00 +02:00
reduce : ( & customTextProjection { } ) . reduceSet ,
2021-10-29 16:11:47 +02:00
args : args {
2023-10-19 12:19:10 +02:00
event : getEvent (
testEvent (
instance . CustomTextSetEventType ,
instance . AggregateType ,
[ ] byte ( ` {
2021-10-29 16:11:47 +02:00
"key" : "Text" ,
"language" : "en" ,
"template" : "InitCode" ,
"text" : "Test"
} ` ) ,
2023-10-19 12:19:10 +02:00
) , instance . CustomTextSetEventMapper ) ,
2021-10-29 16:11:47 +02:00
} ,
want : wantReduce {
2023-10-19 12:19:10 +02:00
aggregateType : eventstore . AggregateType ( "instance" ) ,
sequence : 15 ,
2021-10-29 16:11:47 +02:00
executer : & testExecuter {
executions : [ ] execution {
{
2024-02-22 18:25:47 +01:00
expectedStmt : "INSERT INTO projections.custom_texts2 (aggregate_id, instance_id, creation_date, change_date, sequence, is_default, template, language, key, text) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ON CONFLICT (instance_id, aggregate_id, template, key, language) DO UPDATE SET (creation_date, change_date, sequence, is_default, text) = (projections.custom_texts2.creation_date, EXCLUDED.change_date, EXCLUDED.sequence, EXCLUDED.is_default, EXCLUDED.text)" ,
2021-10-29 16:11:47 +02:00
expectedArgs : [ ] interface { } {
"agg-id" ,
2022-03-23 09:02:39 +01:00
"instance-id" ,
2021-10-29 16:11:47 +02:00
anyArg { } ,
anyArg { } ,
uint64 ( 15 ) ,
true ,
"InitCode" ,
"en" ,
"Text" ,
"Test" ,
} ,
} ,
} ,
} ,
} ,
} ,
{
2022-11-10 11:59:33 +01:00
name : "instance reduceRemoved" ,
2022-06-14 07:51:00 +02:00
reduce : ( & customTextProjection { } ) . reduceRemoved ,
2021-10-29 16:11:47 +02:00
args : args {
2023-10-19 12:19:10 +02:00
event : getEvent (
testEvent (
instance . CustomTextTemplateRemovedEventType ,
instance . AggregateType ,
[ ] byte ( ` {
2021-10-29 16:11:47 +02:00
"key" : "Text" ,
"language" : "en" ,
"template" : "InitCode"
} ` ) ,
2023-10-19 12:19:10 +02:00
) , instance . CustomTextRemovedEventMapper ) ,
2021-10-29 16:11:47 +02:00
} ,
want : wantReduce {
2023-10-19 12:19:10 +02:00
aggregateType : eventstore . AggregateType ( "instance" ) ,
sequence : 15 ,
2021-10-29 16:11:47 +02:00
executer : & testExecuter {
executions : [ ] execution {
{
2022-11-30 17:01:17 +01:00
expectedStmt : "DELETE FROM projections.custom_texts2 WHERE (aggregate_id = $1) AND (template = $2) AND (key = $3) AND (language = $4) AND (instance_id = $5)" ,
2021-10-29 16:11:47 +02:00
expectedArgs : [ ] interface { } {
"agg-id" ,
"InitCode" ,
"Text" ,
2021-12-16 15:21:37 +01:00
"en" ,
2022-11-10 11:59:33 +01:00
"instance-id" ,
2021-10-29 16:11:47 +02:00
} ,
} ,
} ,
} ,
} ,
} ,
{
2022-11-10 11:59:33 +01:00
name : "instance reduceTemplateRemoved" ,
2022-06-14 07:51:00 +02:00
reduce : ( & customTextProjection { } ) . reduceTemplateRemoved ,
2021-10-29 16:11:47 +02:00
args : args {
2023-10-19 12:19:10 +02:00
event : getEvent (
testEvent (
instance . CustomTextTemplateRemovedEventType ,
instance . AggregateType ,
[ ] byte ( ` {
2021-10-29 16:11:47 +02:00
"key" : "Text" ,
"language" : "en" ,
"template" : "InitCode"
} ` ) ,
2023-10-19 12:19:10 +02:00
) , instance . CustomTextTemplateRemovedEventMapper ) ,
2021-10-29 16:11:47 +02:00
} ,
want : wantReduce {
2023-10-19 12:19:10 +02:00
aggregateType : eventstore . AggregateType ( "instance" ) ,
sequence : 15 ,
2021-10-29 16:11:47 +02:00
executer : & testExecuter {
executions : [ ] execution {
{
2022-11-30 17:01:17 +01:00
expectedStmt : "DELETE FROM projections.custom_texts2 WHERE (aggregate_id = $1) AND (template = $2) AND (language = $3) AND (instance_id = $4)" ,
2021-10-29 16:11:47 +02:00
expectedArgs : [ ] interface { } {
"agg-id" ,
"InitCode" ,
2021-12-17 09:31:39 +01:00
"en" ,
2022-11-10 11:59:33 +01:00
"instance-id" ,
2021-10-29 16:11:47 +02:00
} ,
} ,
} ,
} ,
} ,
} ,
2022-11-30 17:01:17 +01:00
{
name : "org.reduceOwnerRemoved" ,
reduce : ( & customTextProjection { } ) . reduceOwnerRemoved ,
args : args {
2023-10-19 12:19:10 +02:00
event : getEvent (
testEvent (
org . OrgRemovedEventType ,
org . AggregateType ,
nil ,
) , org . OrgRemovedEventMapper ) ,
2022-11-30 17:01:17 +01:00
} ,
want : wantReduce {
2023-10-19 12:19:10 +02:00
aggregateType : eventstore . AggregateType ( "org" ) ,
sequence : 15 ,
2022-11-30 17:01:17 +01:00
executer : & testExecuter {
executions : [ ] execution {
{
2023-09-07 06:54:51 +02:00
expectedStmt : "DELETE FROM projections.custom_texts2 WHERE (instance_id = $1) AND (aggregate_id = $2)" ,
2022-11-30 17:01:17 +01:00
expectedArgs : [ ] interface { } {
"instance-id" ,
"agg-id" ,
} ,
} ,
} ,
} ,
} ,
} ,
2021-10-29 16:11:47 +02:00
}
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
event := baseEvent ( t )
got , err := tt . reduce ( event )
2023-12-08 16:30:55 +02:00
if ok := zerrors . IsErrorInvalidArgument ( err ) ; ! ok {
2021-10-29 16:11:47 +02:00
t . Errorf ( "no wrong event mapping: %v, got: %v" , err , got )
}
event = tt . args . event ( t )
got , err = tt . reduce ( event )
2022-10-20 13:36:52 +01:00
assertReduce ( t , got , err , CustomTextTable , tt . want )
2021-10-29 16:11:47 +02:00
} )
}
}