From cd8e7c31836ef5f0713d477199a73db36808a531 Mon Sep 17 00:00:00 2001 From: Alexander Huck Date: Wed, 1 Nov 2023 15:36:18 +0100 Subject: [PATCH 01/13] fix: better error handling in the transformerfactory --- internal/sync/transformer.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/internal/sync/transformer.go b/internal/sync/transformer.go index 34eb567..f852d8e 100644 --- a/internal/sync/transformer.go +++ b/internal/sync/transformer.go @@ -1,9 +1,10 @@ package sync import ( - "fmt" "strings" + "github.com/charmbracelet/log" + "github.com/inovex/CalendarSync/internal/config" "github.com/inovex/CalendarSync/internal/models" "github.com/inovex/CalendarSync/internal/transformation" @@ -58,8 +59,8 @@ var ( func TransformerFactory(configuredTransformers []config.Transformer) (loadedTransformers []Transformer) { for _, configuredTransformer := range configuredTransformers { if _, nameExists := transformerConfigMapping[configuredTransformer.Name]; !nameExists { - // todo: handle properly - panic(fmt.Sprintf("unknown transformer: %s", configuredTransformer.Name)) + log.Warnf("unknown transformer: %s, skipping..", configuredTransformer.Name) + continue } // load the default Transformer for the configured name and initialize it based on the config transformerDefault := transformerConfigMapping[configuredTransformer.Name] From 80256a89a670b173ba1db9bdb0d49b838fa09fa7 Mon Sep 17 00:00:00 2001 From: Alexander Huck Date: Wed, 1 Nov 2023 15:36:37 +0100 Subject: [PATCH 02/13] fix: better error handling in the filterfactory --- internal/sync/filter.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/internal/sync/filter.go b/internal/sync/filter.go index 7004e9a..e943a9f 100644 --- a/internal/sync/filter.go +++ b/internal/sync/filter.go @@ -1,9 +1,10 @@ package sync import ( - "fmt" "strings" + "github.com/charmbracelet/log" + "github.com/inovex/CalendarSync/internal/config" "github.com/inovex/CalendarSync/internal/filter" "github.com/inovex/CalendarSync/internal/models" @@ -42,8 +43,8 @@ var ( func FilterFactory(configuredFilters []config.Filter) (loadedFilters []Filter) { for _, configuredFilter := range configuredFilters { if _, nameExists := filterConfigMapping[configuredFilter.Name]; !nameExists { - // todo: handle properly - panic(fmt.Sprintf("unknown filter: %s", configuredFilter.Name)) + log.Warnf("unknown filter: %s, skipping..", configuredFilter.Name) + continue } // load the default Transformer for the configured name and initialize it based on the config filterDefault := filterConfigMapping[configuredFilter.Name] From 56d6d14d8cc25bca1e0040dfa3abd46e8c79c2b3 Mon Sep 17 00:00:00 2001 From: Alexander Huck Date: Wed, 1 Nov 2023 15:36:51 +0100 Subject: [PATCH 03/13] fix: add new filter 'regexTitle' --- internal/filter/regexTitle.go | 40 +++++++++++++++++++++++++++++++++++ internal/sync/filter.go | 2 ++ 2 files changed, 42 insertions(+) create mode 100644 internal/filter/regexTitle.go diff --git a/internal/filter/regexTitle.go b/internal/filter/regexTitle.go new file mode 100644 index 0000000..1ad75c1 --- /dev/null +++ b/internal/filter/regexTitle.go @@ -0,0 +1,40 @@ +package filter + +import ( + "regexp" + + "github.com/charmbracelet/log" + + "github.com/inovex/CalendarSync/internal/models" +) + +type RegexTitle struct { + Regexp string +} + +func (a RegexTitle) Name() string { + return "RegexTitle" +} + +func (a RegexTitle) Filter(event models.Event) bool { + + if len(a.Regexp) == 0 { + log.Debugf("Regular Expression is empty, skipping Filter %s for event: %s", a.Name(), event.Title) + return true + } + + log.Debugf("Running Regexp %s on event title: %s", a.Regexp, event.Title) + + r, err := regexp.Compile(a.Regexp) + if err != nil { + log.Fatalf("Regular expression of Filter %s is not valid, please check", a.Name()) + } + + // if the title matches the Regexp, return false (filter the event) + if r.MatchString(event.Title) { + log.Debugf("Regular Expression %s matches the events title: %s, gets filtered", a.Name(), event.Title) + return false + } + + return true +} diff --git a/internal/sync/filter.go b/internal/sync/filter.go index e943a9f..24f343f 100644 --- a/internal/sync/filter.go +++ b/internal/sync/filter.go @@ -32,11 +32,13 @@ var ( filterConfigMapping = map[string]Filter{ "DeclinedEvents": &filter.DeclinedEvents{}, "AllDayEvents": &filter.AllDayEvents{}, + "RegexTitle": &filter.RegexTitle{}, } filterOrder = []string{ "DeclinedEvents", "AllDayEvents", + "RegexTitle", } ) From 720559e61bf5a2ce6c4c5143b10796401924a251 Mon Sep 17 00:00:00 2001 From: Alexander Huck Date: Wed, 1 Nov 2023 15:37:01 +0100 Subject: [PATCH 04/13] test: add test for 'regexTitle' filter --- internal/filter/regexTitle_test.go | 120 +++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 internal/filter/regexTitle_test.go diff --git a/internal/filter/regexTitle_test.go b/internal/filter/regexTitle_test.go new file mode 100644 index 0000000..7957a7a --- /dev/null +++ b/internal/filter/regexTitle_test.go @@ -0,0 +1,120 @@ +package filter + +import ( + "testing" + + "github.com/inovex/CalendarSync/internal/models" + "github.com/stretchr/testify/assert" +) + +// Some events should be filtered +func TestRegexTitleFilter(t *testing.T) { + sourceEvents := []models.Event{ + { + ICalUID: "testId", + ID: "testUid", + Title: "test", + Description: "bar", + }, + { + ICalUID: "testId2", + ID: "testUid2", + Title: "Test 2", + Description: "bar", + }, + { + ICalUID: "testId3", + ID: "testUid2", + Title: "foo", + Description: "bar", + }, + } + + expectedSinkEvents := []models.Event{ + { + ICalUID: "testId2", + ID: "testUid2", + Title: "Test 2", + Description: "bar", + }, + { + ICalUID: "testId3", + ID: "testUid2", + Title: "foo", + Description: "bar", + }, + } + + filter := RegexTitle{ + Regexp: ".*test", + } + + filteredEvents := []models.Event{} + + for _, event := range sourceEvents { + if filter.Filter(event) { + filteredEvents = append(filteredEvents, event) + } + } + + assert.Equal(t, expectedSinkEvents, filteredEvents) +} + +// All Events should be there +func TestRegexTitleFilterEmptyRegex(t *testing.T) { + sourceEvents := []models.Event{ + { + ICalUID: "testId", + ID: "testUid", + Title: "test", + Description: "bar", + }, + { + ICalUID: "testId2", + ID: "testUid2", + Title: "Test 2", + Description: "bar", + }, + { + ICalUID: "testId3", + ID: "testUid2", + Title: "foo", + Description: "bar", + }, + } + + expectedSinkEvents := []models.Event{ + { + ICalUID: "testId", + ID: "testUid", + Title: "test", + Description: "bar", + }, + { + ICalUID: "testId2", + ID: "testUid2", + Title: "Test 2", + Description: "bar", + }, + { + ICalUID: "testId3", + ID: "testUid2", + Title: "foo", + Description: "bar", + }, + } + + filter := RegexTitle{ + Regexp: "", + } + + filteredEvents := []models.Event{} + + for _, event := range sourceEvents { + if filter.Filter(event) { + filteredEvents = append(filteredEvents, event) + } + } + + assert.Equal(t, expectedSinkEvents, filteredEvents) +} From 492cee7adbd0221598175574fd54979b89753c9c Mon Sep 17 00:00:00 2001 From: Alexander Huck Date: Wed, 1 Nov 2023 15:37:19 +0100 Subject: [PATCH 05/13] test: add test for 'allDayEvents' filter --- internal/filter/allDayEvents_test.go | 61 ++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 internal/filter/allDayEvents_test.go diff --git a/internal/filter/allDayEvents_test.go b/internal/filter/allDayEvents_test.go new file mode 100644 index 0000000..e7812b5 --- /dev/null +++ b/internal/filter/allDayEvents_test.go @@ -0,0 +1,61 @@ +package filter + +import ( + "testing" + + "github.com/inovex/CalendarSync/internal/models" + "github.com/stretchr/testify/assert" +) + +// All Day Events should be filtered +func TestAllDayEventsFilter(t *testing.T) { + sourceEvents := []models.Event{ + { + ICalUID: "testId", + ID: "testUid", + Title: "test", + Description: "bar", + AllDay: true, + }, + { + ICalUID: "testId2", + ID: "testUid2", + Title: "Test 2", + Description: "bar", + AllDay: false, + }, + { + ICalUID: "testId3", + ID: "testUid2", + Title: "foo", + Description: "bar", + }, + } + + expectedSinkEvents := []models.Event{ + { + ICalUID: "testId2", + ID: "testUid2", + Title: "Test 2", + Description: "bar", + }, + { + ICalUID: "testId3", + ID: "testUid2", + Title: "foo", + Description: "bar", + }, + } + + filter := AllDayEvents{} + + filteredEvents := []models.Event{} + + for _, event := range sourceEvents { + if filter.Filter(event) { + filteredEvents = append(filteredEvents, event) + } + } + + assert.Equal(t, expectedSinkEvents, filteredEvents) +} From f63d2f11974bb0af26c4abbedf814121614c23b9 Mon Sep 17 00:00:00 2001 From: Alexander Huck Date: Wed, 1 Nov 2023 15:37:52 +0100 Subject: [PATCH 06/13] test: add test for 'declinedEvents' filter --- internal/filter/declinedEvents_test.go | 66 ++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 internal/filter/declinedEvents_test.go diff --git a/internal/filter/declinedEvents_test.go b/internal/filter/declinedEvents_test.go new file mode 100644 index 0000000..cdd882c --- /dev/null +++ b/internal/filter/declinedEvents_test.go @@ -0,0 +1,66 @@ +package filter + +import ( + "testing" + + "github.com/inovex/CalendarSync/internal/models" + "github.com/stretchr/testify/assert" +) + +// Declined Events should be filtered +func TestDeclinedEventsFilter(t *testing.T) { + sourceEvents := []models.Event{ + { + ICalUID: "testId", + ID: "testUid", + Title: "test", + Description: "bar", + AllDay: true, + Accepted: false, + }, + { + ICalUID: "testId2", + ID: "testUid2", + Title: "Test 2", + Description: "bar", + AllDay: false, + Accepted: true, + }, + { + ICalUID: "testId3", + ID: "testUid3", + Title: "foo", + Description: "bar", + Accepted: true, + }, + } + + expectedSinkEvents := []models.Event{ + { + ICalUID: "testId2", + ID: "testUid2", + Title: "Test 2", + Description: "bar", + Accepted: true, + }, + { + ICalUID: "testId3", + ID: "testUid3", + Title: "foo", + Description: "bar", + Accepted: true, + }, + } + + filter := DeclinedEvents{} + + filteredEvents := []models.Event{} + + for _, event := range sourceEvents { + if filter.Filter(event) { + filteredEvents = append(filteredEvents, event) + } + } + + assert.Equal(t, expectedSinkEvents, filteredEvents) +} From e2f01509c09c763c813a51f12a057118f8194dd5 Mon Sep 17 00:00:00 2001 From: Alexander Huck Date: Wed, 1 Nov 2023 15:39:53 +0100 Subject: [PATCH 07/13] docs: add regexTitle filter to example sync yaml --- example.sync.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/example.sync.yaml b/example.sync.yaml index 1dfaadc..da14720 100644 --- a/example.sync.yaml +++ b/example.sync.yaml @@ -60,6 +60,10 @@ filters: - name: DeclinedEvents # Events which cover the full day aren't synced - name: AllDayEvents + # Events which match the following regular expression, syntax here: https://github.com/google/re2/wiki/Syntax + - name: RegexTitle + config: + Regexp: ".*test" # Perform multiple calendar updates concurrently # Defaults to 1 if not set From 29bb0729bf748ebd06a1f2b43876d36c0d936d6d Mon Sep 17 00:00:00 2001 From: Alexander Huck Date: Mon, 6 Nov 2023 17:09:55 +0100 Subject: [PATCH 08/13] fix: rename Regexp to ExcludeRegexp --- example.sync.yaml | 6 +++--- internal/filter/regexTitle.go | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/example.sync.yaml b/example.sync.yaml index da14720..2faa181 100644 --- a/example.sync.yaml +++ b/example.sync.yaml @@ -25,7 +25,7 @@ source: tenantId: "[UUID-format string here]" # ZEP source adapter -#source: +#source: # adapter: # type: "zep" # calendar: "absences" @@ -60,10 +60,10 @@ filters: - name: DeclinedEvents # Events which cover the full day aren't synced - name: AllDayEvents - # Events which match the following regular expression, syntax here: https://github.com/google/re2/wiki/Syntax + # Exlude Events which match the following regular expression, syntax here: https://github.com/google/re2/wiki/Syntax - name: RegexTitle config: - Regexp: ".*test" + ExludeRegexp: ".*test" # Perform multiple calendar updates concurrently # Defaults to 1 if not set diff --git a/internal/filter/regexTitle.go b/internal/filter/regexTitle.go index 1ad75c1..9bef72d 100644 --- a/internal/filter/regexTitle.go +++ b/internal/filter/regexTitle.go @@ -9,7 +9,7 @@ import ( ) type RegexTitle struct { - Regexp string + ExludeRegexp string } func (a RegexTitle) Name() string { @@ -18,14 +18,14 @@ func (a RegexTitle) Name() string { func (a RegexTitle) Filter(event models.Event) bool { - if len(a.Regexp) == 0 { + if len(a.ExludeRegexp) == 0 { log.Debugf("Regular Expression is empty, skipping Filter %s for event: %s", a.Name(), event.Title) return true } - log.Debugf("Running Regexp %s on event title: %s", a.Regexp, event.Title) + log.Debugf("Running Regexp %s on event title: %s", a.ExludeRegexp, event.Title) - r, err := regexp.Compile(a.Regexp) + r, err := regexp.Compile(a.ExludeRegexp) if err != nil { log.Fatalf("Regular expression of Filter %s is not valid, please check", a.Name()) } From a68f7d659892f291107116322dec348e9862cb19 Mon Sep 17 00:00:00 2001 From: Alexander Huck Date: Mon, 6 Nov 2023 17:10:08 +0100 Subject: [PATCH 09/13] fix: three dots instead of two --- internal/sync/filter.go | 2 +- internal/sync/transformer.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/sync/filter.go b/internal/sync/filter.go index 24f343f..3222995 100644 --- a/internal/sync/filter.go +++ b/internal/sync/filter.go @@ -45,7 +45,7 @@ var ( func FilterFactory(configuredFilters []config.Filter) (loadedFilters []Filter) { for _, configuredFilter := range configuredFilters { if _, nameExists := filterConfigMapping[configuredFilter.Name]; !nameExists { - log.Warnf("unknown filter: %s, skipping..", configuredFilter.Name) + log.Warnf("unknown filter: %s, skipping...", configuredFilter.Name) continue } // load the default Transformer for the configured name and initialize it based on the config diff --git a/internal/sync/transformer.go b/internal/sync/transformer.go index f852d8e..a9864fd 100644 --- a/internal/sync/transformer.go +++ b/internal/sync/transformer.go @@ -59,7 +59,7 @@ var ( func TransformerFactory(configuredTransformers []config.Transformer) (loadedTransformers []Transformer) { for _, configuredTransformer := range configuredTransformers { if _, nameExists := transformerConfigMapping[configuredTransformer.Name]; !nameExists { - log.Warnf("unknown transformer: %s, skipping..", configuredTransformer.Name) + log.Warnf("unknown transformer: %s, skipping...", configuredTransformer.Name) continue } // load the default Transformer for the configured name and initialize it based on the config From 3c6c62e9488b34f5957ab650d4aeb6161d102abe Mon Sep 17 00:00:00 2001 From: Alexander Huck Date: Mon, 6 Nov 2023 17:10:37 +0100 Subject: [PATCH 10/13] refactor: deduplicate filter test code and add util func --- internal/filter/allDayEvents_test.go | 23 +---- internal/filter/declinedEvents_test.go | 28 +----- internal/filter/regexTitle_test.go | 118 ++++++------------------- internal/filter/util.go | 21 +++++ 4 files changed, 52 insertions(+), 138 deletions(-) create mode 100644 internal/filter/util.go diff --git a/internal/filter/allDayEvents_test.go b/internal/filter/allDayEvents_test.go index e7812b5..c9fc50f 100644 --- a/internal/filter/allDayEvents_test.go +++ b/internal/filter/allDayEvents_test.go @@ -32,30 +32,11 @@ func TestAllDayEventsFilter(t *testing.T) { }, } - expectedSinkEvents := []models.Event{ - { - ICalUID: "testId2", - ID: "testUid2", - Title: "Test 2", - Description: "bar", - }, - { - ICalUID: "testId3", - ID: "testUid2", - Title: "foo", - Description: "bar", - }, - } + expectedSinkEvents := []models.Event{sourceEvents[1], sourceEvents[2]} filter := AllDayEvents{} - filteredEvents := []models.Event{} - - for _, event := range sourceEvents { - if filter.Filter(event) { - filteredEvents = append(filteredEvents, event) - } - } + filteredEvents := FilterEvents(sourceEvents, filter) assert.Equal(t, expectedSinkEvents, filteredEvents) } diff --git a/internal/filter/declinedEvents_test.go b/internal/filter/declinedEvents_test.go index cdd882c..cd7531d 100644 --- a/internal/filter/declinedEvents_test.go +++ b/internal/filter/declinedEvents_test.go @@ -15,7 +15,6 @@ func TestDeclinedEventsFilter(t *testing.T) { ID: "testUid", Title: "test", Description: "bar", - AllDay: true, Accepted: false, }, { @@ -23,7 +22,6 @@ func TestDeclinedEventsFilter(t *testing.T) { ID: "testUid2", Title: "Test 2", Description: "bar", - AllDay: false, Accepted: true, }, { @@ -35,32 +33,10 @@ func TestDeclinedEventsFilter(t *testing.T) { }, } - expectedSinkEvents := []models.Event{ - { - ICalUID: "testId2", - ID: "testUid2", - Title: "Test 2", - Description: "bar", - Accepted: true, - }, - { - ICalUID: "testId3", - ID: "testUid3", - Title: "foo", - Description: "bar", - Accepted: true, - }, - } + expectedSinkEvents := []models.Event{sourceEvents[1], sourceEvents[2]} filter := DeclinedEvents{} - - filteredEvents := []models.Event{} - - for _, event := range sourceEvents { - if filter.Filter(event) { - filteredEvents = append(filteredEvents, event) - } - } + filteredEvents := FilterEvents(sourceEvents, filter) assert.Equal(t, expectedSinkEvents, filteredEvents) } diff --git a/internal/filter/regexTitle_test.go b/internal/filter/regexTitle_test.go index 7957a7a..ad8f00d 100644 --- a/internal/filter/regexTitle_test.go +++ b/internal/filter/regexTitle_test.go @@ -7,114 +7,50 @@ import ( "github.com/stretchr/testify/assert" ) +var sourceEvents = []models.Event{ + { + ICalUID: "testId", + ID: "testUid", + Title: "test", + Description: "bar", + }, + { + ICalUID: "testId2", + ID: "testUid2", + Title: "Test 2", + Description: "bar", + }, + { + ICalUID: "testId3", + ID: "testUid2", + Title: "foo", + Description: "bar", + }, +} + // Some events should be filtered func TestRegexTitleFilter(t *testing.T) { - sourceEvents := []models.Event{ - { - ICalUID: "testId", - ID: "testUid", - Title: "test", - Description: "bar", - }, - { - ICalUID: "testId2", - ID: "testUid2", - Title: "Test 2", - Description: "bar", - }, - { - ICalUID: "testId3", - ID: "testUid2", - Title: "foo", - Description: "bar", - }, - } - expectedSinkEvents := []models.Event{ - { - ICalUID: "testId2", - ID: "testUid2", - Title: "Test 2", - Description: "bar", - }, - { - ICalUID: "testId3", - ID: "testUid2", - Title: "foo", - Description: "bar", - }, - } + expectedSinkEvents := []models.Event{sourceEvents[1], sourceEvents[2]} filter := RegexTitle{ - Regexp: ".*test", + ExludeRegexp: ".*test", } - filteredEvents := []models.Event{} - - for _, event := range sourceEvents { - if filter.Filter(event) { - filteredEvents = append(filteredEvents, event) - } - } + filteredEvents := FilterEvents(sourceEvents, filter) assert.Equal(t, expectedSinkEvents, filteredEvents) } // All Events should be there func TestRegexTitleFilterEmptyRegex(t *testing.T) { - sourceEvents := []models.Event{ - { - ICalUID: "testId", - ID: "testUid", - Title: "test", - Description: "bar", - }, - { - ICalUID: "testId2", - ID: "testUid2", - Title: "Test 2", - Description: "bar", - }, - { - ICalUID: "testId3", - ID: "testUid2", - Title: "foo", - Description: "bar", - }, - } - - expectedSinkEvents := []models.Event{ - { - ICalUID: "testId", - ID: "testUid", - Title: "test", - Description: "bar", - }, - { - ICalUID: "testId2", - ID: "testUid2", - Title: "Test 2", - Description: "bar", - }, - { - ICalUID: "testId3", - ID: "testUid2", - Title: "foo", - Description: "bar", - }, - } + expectedSinkEvents := sourceEvents filter := RegexTitle{ - Regexp: "", + ExludeRegexp: "", } - filteredEvents := []models.Event{} - - for _, event := range sourceEvents { - if filter.Filter(event) { - filteredEvents = append(filteredEvents, event) - } - } + filteredEvents := FilterEvents(sourceEvents, filter) assert.Equal(t, expectedSinkEvents, filteredEvents) } diff --git a/internal/filter/util.go b/internal/filter/util.go new file mode 100644 index 0000000..6e1fe23 --- /dev/null +++ b/internal/filter/util.go @@ -0,0 +1,21 @@ +package filter + +import ( + "github.com/inovex/CalendarSync/internal/models" +) + +// Need to declare another interface similar to the sync.Filter interface here, otherwise we would land in an import loop +type MockFilter interface { + Filter(models.Event) bool +} + +// FilterEvents takes an array of events and a filter and executes the .Filter Method on each of the sourceEvents +// Not exluded events get returned in the filteredEvents +func FilterEvents(sourceEvents []models.Event, filter MockFilter) (filteredEvents []models.Event) { + for _, event := range sourceEvents { + if filter.Filter(event) { + filteredEvents = append(filteredEvents, event) + } + } + return filteredEvents +} From 5bac9e0b9dd71bf17fd2aaaa5a2e6d95cc216168 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Mon, 6 Nov 2023 20:56:30 +0100 Subject: [PATCH 11/13] refactor: Move filter tests into filter_test packages This allows removing MockFilter interface without causing an import loop. --- internal/filter/allDayEvents_test.go | 7 ++++--- internal/filter/declinedEvents_test.go | 7 ++++--- internal/filter/regexTitle_test.go | 11 ++++++----- internal/filter/{util.go => util_test.go} | 10 +++------- 4 files changed, 17 insertions(+), 18 deletions(-) rename internal/filter/{util.go => util_test.go} (56%) diff --git a/internal/filter/allDayEvents_test.go b/internal/filter/allDayEvents_test.go index c9fc50f..d7554b4 100644 --- a/internal/filter/allDayEvents_test.go +++ b/internal/filter/allDayEvents_test.go @@ -1,8 +1,9 @@ -package filter +package filter_test import ( "testing" + "github.com/inovex/CalendarSync/internal/filter" "github.com/inovex/CalendarSync/internal/models" "github.com/stretchr/testify/assert" ) @@ -34,9 +35,9 @@ func TestAllDayEventsFilter(t *testing.T) { expectedSinkEvents := []models.Event{sourceEvents[1], sourceEvents[2]} - filter := AllDayEvents{} + eventFilter := filter.AllDayEvents{} - filteredEvents := FilterEvents(sourceEvents, filter) + filteredEvents := FilterEvents(sourceEvents, eventFilter) assert.Equal(t, expectedSinkEvents, filteredEvents) } diff --git a/internal/filter/declinedEvents_test.go b/internal/filter/declinedEvents_test.go index cd7531d..23c6125 100644 --- a/internal/filter/declinedEvents_test.go +++ b/internal/filter/declinedEvents_test.go @@ -1,8 +1,9 @@ -package filter +package filter_test import ( "testing" + "github.com/inovex/CalendarSync/internal/filter" "github.com/inovex/CalendarSync/internal/models" "github.com/stretchr/testify/assert" ) @@ -35,8 +36,8 @@ func TestDeclinedEventsFilter(t *testing.T) { expectedSinkEvents := []models.Event{sourceEvents[1], sourceEvents[2]} - filter := DeclinedEvents{} - filteredEvents := FilterEvents(sourceEvents, filter) + eventFilter := filter.DeclinedEvents{} + filteredEvents := FilterEvents(sourceEvents, eventFilter) assert.Equal(t, expectedSinkEvents, filteredEvents) } diff --git a/internal/filter/regexTitle_test.go b/internal/filter/regexTitle_test.go index ad8f00d..1504135 100644 --- a/internal/filter/regexTitle_test.go +++ b/internal/filter/regexTitle_test.go @@ -1,8 +1,9 @@ -package filter +package filter_test import ( "testing" + "github.com/inovex/CalendarSync/internal/filter" "github.com/inovex/CalendarSync/internal/models" "github.com/stretchr/testify/assert" ) @@ -33,11 +34,11 @@ func TestRegexTitleFilter(t *testing.T) { expectedSinkEvents := []models.Event{sourceEvents[1], sourceEvents[2]} - filter := RegexTitle{ + eventFilter := filter.RegexTitle{ ExludeRegexp: ".*test", } - filteredEvents := FilterEvents(sourceEvents, filter) + filteredEvents := FilterEvents(sourceEvents, eventFilter) assert.Equal(t, expectedSinkEvents, filteredEvents) } @@ -46,11 +47,11 @@ func TestRegexTitleFilter(t *testing.T) { func TestRegexTitleFilterEmptyRegex(t *testing.T) { expectedSinkEvents := sourceEvents - filter := RegexTitle{ + eventFilter := filter.RegexTitle{ ExludeRegexp: "", } - filteredEvents := FilterEvents(sourceEvents, filter) + filteredEvents := FilterEvents(sourceEvents, eventFilter) assert.Equal(t, expectedSinkEvents, filteredEvents) } diff --git a/internal/filter/util.go b/internal/filter/util_test.go similarity index 56% rename from internal/filter/util.go rename to internal/filter/util_test.go index 6e1fe23..59a5be1 100644 --- a/internal/filter/util.go +++ b/internal/filter/util_test.go @@ -1,17 +1,13 @@ -package filter +package filter_test import ( "github.com/inovex/CalendarSync/internal/models" + "github.com/inovex/CalendarSync/internal/sync" ) -// Need to declare another interface similar to the sync.Filter interface here, otherwise we would land in an import loop -type MockFilter interface { - Filter(models.Event) bool -} - // FilterEvents takes an array of events and a filter and executes the .Filter Method on each of the sourceEvents // Not exluded events get returned in the filteredEvents -func FilterEvents(sourceEvents []models.Event, filter MockFilter) (filteredEvents []models.Event) { +func FilterEvents(sourceEvents []models.Event, filter sync.Filter) (filteredEvents []models.Event) { for _, event := range sourceEvents { if filter.Filter(event) { filteredEvents = append(filteredEvents, event) From e8700ffaad72c78db27200004334f861c9f15d68 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Mon, 6 Nov 2023 20:57:42 +0100 Subject: [PATCH 12/13] refactor: filter: deduplicate filter asserts --- internal/filter/allDayEvents_test.go | 6 +----- internal/filter/declinedEvents_test.go | 5 +---- internal/filter/regexTitle_test.go | 11 ++--------- internal/filter/util_test.go | 6 ++++++ 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/internal/filter/allDayEvents_test.go b/internal/filter/allDayEvents_test.go index d7554b4..341959c 100644 --- a/internal/filter/allDayEvents_test.go +++ b/internal/filter/allDayEvents_test.go @@ -5,7 +5,6 @@ import ( "github.com/inovex/CalendarSync/internal/filter" "github.com/inovex/CalendarSync/internal/models" - "github.com/stretchr/testify/assert" ) // All Day Events should be filtered @@ -36,8 +35,5 @@ func TestAllDayEventsFilter(t *testing.T) { expectedSinkEvents := []models.Event{sourceEvents[1], sourceEvents[2]} eventFilter := filter.AllDayEvents{} - - filteredEvents := FilterEvents(sourceEvents, eventFilter) - - assert.Equal(t, expectedSinkEvents, filteredEvents) + checkEventFilter(t, eventFilter, sourceEvents, expectedSinkEvents) } diff --git a/internal/filter/declinedEvents_test.go b/internal/filter/declinedEvents_test.go index 23c6125..54c81fe 100644 --- a/internal/filter/declinedEvents_test.go +++ b/internal/filter/declinedEvents_test.go @@ -5,7 +5,6 @@ import ( "github.com/inovex/CalendarSync/internal/filter" "github.com/inovex/CalendarSync/internal/models" - "github.com/stretchr/testify/assert" ) // Declined Events should be filtered @@ -37,7 +36,5 @@ func TestDeclinedEventsFilter(t *testing.T) { expectedSinkEvents := []models.Event{sourceEvents[1], sourceEvents[2]} eventFilter := filter.DeclinedEvents{} - filteredEvents := FilterEvents(sourceEvents, eventFilter) - - assert.Equal(t, expectedSinkEvents, filteredEvents) + checkEventFilter(t, eventFilter, sourceEvents, expectedSinkEvents) } diff --git a/internal/filter/regexTitle_test.go b/internal/filter/regexTitle_test.go index 1504135..de7a6ca 100644 --- a/internal/filter/regexTitle_test.go +++ b/internal/filter/regexTitle_test.go @@ -5,7 +5,6 @@ import ( "github.com/inovex/CalendarSync/internal/filter" "github.com/inovex/CalendarSync/internal/models" - "github.com/stretchr/testify/assert" ) var sourceEvents = []models.Event{ @@ -37,10 +36,7 @@ func TestRegexTitleFilter(t *testing.T) { eventFilter := filter.RegexTitle{ ExludeRegexp: ".*test", } - - filteredEvents := FilterEvents(sourceEvents, eventFilter) - - assert.Equal(t, expectedSinkEvents, filteredEvents) + checkEventFilter(t, eventFilter, sourceEvents, expectedSinkEvents) } // All Events should be there @@ -50,8 +46,5 @@ func TestRegexTitleFilterEmptyRegex(t *testing.T) { eventFilter := filter.RegexTitle{ ExludeRegexp: "", } - - filteredEvents := FilterEvents(sourceEvents, eventFilter) - - assert.Equal(t, expectedSinkEvents, filteredEvents) + checkEventFilter(t, eventFilter, sourceEvents, expectedSinkEvents) } diff --git a/internal/filter/util_test.go b/internal/filter/util_test.go index 59a5be1..2c452ab 100644 --- a/internal/filter/util_test.go +++ b/internal/filter/util_test.go @@ -3,6 +3,7 @@ package filter_test import ( "github.com/inovex/CalendarSync/internal/models" "github.com/inovex/CalendarSync/internal/sync" + "github.com/stretchr/testify/assert" ) // FilterEvents takes an array of events and a filter and executes the .Filter Method on each of the sourceEvents @@ -15,3 +16,8 @@ func FilterEvents(sourceEvents []models.Event, filter sync.Filter) (filteredEven } return filteredEvents } + +func checkEventFilter(t assert.TestingT, filter sync.Filter, sourceEvents []models.Event, expectedEvents []models.Event) { + filteredEvents := FilterEvents(sourceEvents, filter) + assert.Equal(t, expectedEvents, filteredEvents) +} From 29ee397b9d778b36bf605f213dc7493f475dc350 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Mon, 6 Nov 2023 21:12:21 +0100 Subject: [PATCH 13/13] fix: fix typo in exclude filter --- example.sync.yaml | 4 ++-- internal/filter/regexTitle.go | 8 ++++---- internal/filter/regexTitle_test.go | 4 ++-- internal/filter/util_test.go | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/example.sync.yaml b/example.sync.yaml index 2faa181..d0bdc54 100644 --- a/example.sync.yaml +++ b/example.sync.yaml @@ -60,10 +60,10 @@ filters: - name: DeclinedEvents # Events which cover the full day aren't synced - name: AllDayEvents - # Exlude Events which match the following regular expression, syntax here: https://github.com/google/re2/wiki/Syntax + # Exclude Events which match the following regular expression, syntax here: https://github.com/google/re2/wiki/Syntax - name: RegexTitle config: - ExludeRegexp: ".*test" + ExcludeRegexp: ".*test" # Perform multiple calendar updates concurrently # Defaults to 1 if not set diff --git a/internal/filter/regexTitle.go b/internal/filter/regexTitle.go index 9bef72d..ad23b78 100644 --- a/internal/filter/regexTitle.go +++ b/internal/filter/regexTitle.go @@ -9,7 +9,7 @@ import ( ) type RegexTitle struct { - ExludeRegexp string + ExcludeRegexp string } func (a RegexTitle) Name() string { @@ -18,14 +18,14 @@ func (a RegexTitle) Name() string { func (a RegexTitle) Filter(event models.Event) bool { - if len(a.ExludeRegexp) == 0 { + if len(a.ExcludeRegexp) == 0 { log.Debugf("Regular Expression is empty, skipping Filter %s for event: %s", a.Name(), event.Title) return true } - log.Debugf("Running Regexp %s on event title: %s", a.ExludeRegexp, event.Title) + log.Debugf("Running Regexp %s on event title: %s", a.ExcludeRegexp, event.Title) - r, err := regexp.Compile(a.ExludeRegexp) + r, err := regexp.Compile(a.ExcludeRegexp) if err != nil { log.Fatalf("Regular expression of Filter %s is not valid, please check", a.Name()) } diff --git a/internal/filter/regexTitle_test.go b/internal/filter/regexTitle_test.go index de7a6ca..03ae28d 100644 --- a/internal/filter/regexTitle_test.go +++ b/internal/filter/regexTitle_test.go @@ -34,7 +34,7 @@ func TestRegexTitleFilter(t *testing.T) { expectedSinkEvents := []models.Event{sourceEvents[1], sourceEvents[2]} eventFilter := filter.RegexTitle{ - ExludeRegexp: ".*test", + ExcludeRegexp: ".*test", } checkEventFilter(t, eventFilter, sourceEvents, expectedSinkEvents) } @@ -44,7 +44,7 @@ func TestRegexTitleFilterEmptyRegex(t *testing.T) { expectedSinkEvents := sourceEvents eventFilter := filter.RegexTitle{ - ExludeRegexp: "", + ExcludeRegexp: "", } checkEventFilter(t, eventFilter, sourceEvents, expectedSinkEvents) } diff --git a/internal/filter/util_test.go b/internal/filter/util_test.go index 2c452ab..924064d 100644 --- a/internal/filter/util_test.go +++ b/internal/filter/util_test.go @@ -7,7 +7,7 @@ import ( ) // FilterEvents takes an array of events and a filter and executes the .Filter Method on each of the sourceEvents -// Not exluded events get returned in the filteredEvents +// Not excluded events get returned in the filteredEvents func FilterEvents(sourceEvents []models.Event, filter sync.Filter) (filteredEvents []models.Event) { for _, event := range sourceEvents { if filter.Filter(event) {