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