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 <martin@humanoids.be> Reviewed-on: https://kolaente.dev/vikunja/api/pulls/697 Co-Authored-By: freaktechnik <martin@humanoids.be> Co-Committed-By: freaktechnik <martin@humanoids.be>
This commit is contained in:
parent
760278fde6
commit
ffce9b51cc
2 changed files with 133 additions and 3 deletions
|
@ -18,6 +18,7 @@ package caldav
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -92,11 +93,17 @@ PRODID:-//` + config.ProdID + `//EN`
|
||||||
e.UID = makeCalDavTimeFromTimeStamp(e.Timestamp) + utils.Sha256(e.Summary)
|
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 += `
|
caldavevents += `
|
||||||
BEGIN:VEVENT
|
BEGIN:VEVENT
|
||||||
UID:` + e.UID + `
|
UID:` + e.UID + `
|
||||||
SUMMARY:` + e.Summary + `
|
SUMMARY:` + e.Summary + `
|
||||||
DESCRIPTION:` + e.Description + `
|
DESCRIPTION:` + formattedDescription + `
|
||||||
DTSTAMP:` + makeCalDavTimeFromTimeStamp(e.Timestamp) + `
|
DTSTAMP:` + makeCalDavTimeFromTimeStamp(e.Timestamp) + `
|
||||||
DTSTART:` + makeCalDavTimeFromTimeStamp(e.Start) + `
|
DTSTART:` + makeCalDavTimeFromTimeStamp(e.Start) + `
|
||||||
DTEND:` + makeCalDavTimeFromTimeStamp(e.End)
|
DTEND:` + makeCalDavTimeFromTimeStamp(e.End)
|
||||||
|
@ -152,12 +159,15 @@ DTSTART: ` + makeCalDavTimeFromTimeStamp(t.Start)
|
||||||
DTEND: ` + makeCalDavTimeFromTimeStamp(t.End)
|
DTEND: ` + makeCalDavTimeFromTimeStamp(t.End)
|
||||||
}
|
}
|
||||||
if t.Description != "" {
|
if t.Description != "" {
|
||||||
|
re := regexp.MustCompile(`\r?\n`)
|
||||||
|
formattedDescription := re.ReplaceAllString(t.Description, "\\n")
|
||||||
caldavtodos += `
|
caldavtodos += `
|
||||||
DESCRIPTION:` + t.Description
|
DESCRIPTION:` + formattedDescription
|
||||||
}
|
}
|
||||||
if t.Completed.Unix() > 0 {
|
if t.Completed.Unix() > 0 {
|
||||||
caldavtodos += `
|
caldavtodos += `
|
||||||
COMPLETED: ` + makeCalDavTimeFromTimeStamp(t.Completed)
|
COMPLETED:` + makeCalDavTimeFromTimeStamp(t.Completed) + `
|
||||||
|
STATUS:COMPLETED`
|
||||||
}
|
}
|
||||||
if t.Organizer != nil {
|
if t.Organizer != nil {
|
||||||
caldavtodos += `
|
caldavtodos += `
|
||||||
|
|
|
@ -239,6 +239,41 @@ DTSTAMP:20181202T050024
|
||||||
DTSTART:20181202T050024
|
DTSTART:20181202T050024
|
||||||
DTEND:20181202T050320
|
DTEND:20181202T050320
|
||||||
END:VEVENT
|
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`,
|
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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue