From ffce9b51ccd8ebfe938e181df4fb3e7c433da91d Mon Sep 17 00:00:00 2001 From: freaktechnik Date: Wed, 21 Oct 2020 21:03:19 +0000 Subject: [PATCH] Fix completion status in DAV for OpenTasks and multiline descriptions (#697) Add tests for multiline descriptions and completed state Fix caldav descriptions Fix caldav task complete status for OpenTasks Co-authored-by: Martin Giger Reviewed-on: https://kolaente.dev/vikunja/api/pulls/697 Co-Authored-By: freaktechnik Co-Committed-By: freaktechnik --- pkg/caldav/caldav.go | 16 ++++- pkg/caldav/caldav_test.go | 120 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 3 deletions(-) diff --git a/pkg/caldav/caldav.go b/pkg/caldav/caldav.go index 067a50bae..228aa7a78 100644 --- a/pkg/caldav/caldav.go +++ b/pkg/caldav/caldav.go @@ -18,6 +18,7 @@ package caldav import ( "fmt" + "regexp" "strconv" "strings" "time" @@ -92,11 +93,17 @@ PRODID:-//` + config.ProdID + `//EN` e.UID = makeCalDavTimeFromTimeStamp(e.Timestamp) + utils.Sha256(e.Summary) } + formattedDescription := "" + if e.Description != "" { + re := regexp.MustCompile(`\r?\n`) + formattedDescription = re.ReplaceAllString(e.Description, "\\n") + } + caldavevents += ` BEGIN:VEVENT UID:` + e.UID + ` SUMMARY:` + e.Summary + ` -DESCRIPTION:` + e.Description + ` +DESCRIPTION:` + formattedDescription + ` DTSTAMP:` + makeCalDavTimeFromTimeStamp(e.Timestamp) + ` DTSTART:` + makeCalDavTimeFromTimeStamp(e.Start) + ` DTEND:` + makeCalDavTimeFromTimeStamp(e.End) @@ -152,12 +159,15 @@ DTSTART: ` + makeCalDavTimeFromTimeStamp(t.Start) DTEND: ` + makeCalDavTimeFromTimeStamp(t.End) } if t.Description != "" { + re := regexp.MustCompile(`\r?\n`) + formattedDescription := re.ReplaceAllString(t.Description, "\\n") caldavtodos += ` -DESCRIPTION:` + t.Description +DESCRIPTION:` + formattedDescription } if t.Completed.Unix() > 0 { caldavtodos += ` -COMPLETED: ` + makeCalDavTimeFromTimeStamp(t.Completed) +COMPLETED:` + makeCalDavTimeFromTimeStamp(t.Completed) + ` +STATUS:COMPLETED` } if t.Organizer != nil { caldavtodos += ` diff --git a/pkg/caldav/caldav_test.go b/pkg/caldav/caldav_test.go index 30bd5e4dc..38ff4cb30 100644 --- a/pkg/caldav/caldav_test.go +++ b/pkg/caldav/caldav_test.go @@ -239,6 +239,41 @@ DTSTAMP:20181202T050024 DTSTART:20181202T050024 DTEND:20181202T050320 END:VEVENT +END:VCALENDAR`, + }, + { + name: "Test caldavparsing with multiline description", + args: args{ + config: &Config{ + Name: "test", + ProdID: "RandomProdID which is not random", + }, + events: []*Event{ + { + Summary: "Event #1", + Description: `Lorem Ipsum +Dolor sit amet`, + UID: "randommduid", + Timestamp: time.Unix(1543626724, 0).In(config.GetTimeZone()), + Start: time.Unix(1543626724, 0).In(config.GetTimeZone()), + End: time.Unix(1543627824, 0).In(config.GetTimeZone()), + }, + }, + }, + wantCaldavevents: `BEGIN:VCALENDAR +VERSION:2.0 +METHOD:PUBLISH +X-PUBLISHED-TTL:PT4H +X-WR-CALNAME:test +PRODID:-//RandomProdID which is not random//EN +BEGIN:VEVENT +UID:randommduid +SUMMARY:Event #1 +DESCRIPTION:Lorem Ipsum\nDolor sit amet +DTSTAMP:20181201T011204 +DTSTART:20181201T011204 +DTEND:20181201T013024 +END:VEVENT END:VCALENDAR`, }, } @@ -249,3 +284,88 @@ END:VCALENDAR`, }) } } + +func TestParseTodos(t *testing.T) { + type args struct { + config *Config + todos []*Todo + } + tests := []struct { + name string + args args + wantCaldavtasks string + }{ + { + name: "Test caldavparsing with multiline description", + args: args{ + config: &Config{ + Name: "test", + ProdID: "RandomProdID which is not random", + }, + todos: []*Todo{ + { + Summary: "Todo #1", + Description: `Lorem Ipsum +Dolor sit amet`, + UID: "randommduid", + Timestamp: time.Unix(1543626724, 0).In(config.GetTimeZone()), + }, + }, + }, + wantCaldavtasks: `BEGIN:VCALENDAR +VERSION:2.0 +METHOD:PUBLISH +X-PUBLISHED-TTL:PT4H +X-WR-CALNAME:test +PRODID:-//RandomProdID which is not random//EN +BEGIN:VTODO +UID:randommduid +DTSTAMP:20181201T011204 +SUMMARY:Todo #1 +DESCRIPTION:Lorem Ipsum\nDolor sit amet +LAST-MODIFIED:00010101T000000 +END:VTODO +END:VCALENDAR`, + }, + { + name: "Test caldavparsing with completed task", + args: args{ + config: &Config{ + Name: "test", + ProdID: "RandomProdID which is not random", + }, + todos: []*Todo{ + { + Summary: "Todo #1", + Description: "Lorem Ipsum", + UID: "randommduid", + Timestamp: time.Unix(1543626724, 0).In(config.GetTimeZone()), + Completed: time.Unix(1543627824, 0).In(config.GetTimeZone()), + }, + }, + }, + wantCaldavtasks: `BEGIN:VCALENDAR +VERSION:2.0 +METHOD:PUBLISH +X-PUBLISHED-TTL:PT4H +X-WR-CALNAME:test +PRODID:-//RandomProdID which is not random//EN +BEGIN:VTODO +UID:randommduid +DTSTAMP:20181201T011204 +SUMMARY:Todo #1 +DESCRIPTION:Lorem Ipsum +COMPLETED:20181201T013024 +STATUS:COMPLETED +LAST-MODIFIED:00010101T000000 +END:VTODO +END:VCALENDAR`, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotCaldavtasks := ParseTodos(tt.args.config, tt.args.todos) + assert.Equal(t, gotCaldavtasks, tt.wantCaldavtasks) + }) + } +}