From 3f99189c657e955c798ff1092603a22123eed9e9 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 18 Feb 2020 22:14:25 +0100 Subject: [PATCH 1/4] Fix inserting task structure with related tasks --- .../migration/create_from_structure.go | 1 + .../migration/create_from_structure_test.go | 80 +++++++++++++++++++ pkg/modules/migration/main_test.go | 40 ++++++++++ 3 files changed, 121 insertions(+) create mode 100644 pkg/modules/migration/create_from_structure_test.go create mode 100644 pkg/modules/migration/main_test.go diff --git a/pkg/modules/migration/create_from_structure.go b/pkg/modules/migration/create_from_structure.go index 312941f54..58f78010c 100644 --- a/pkg/modules/migration/create_from_structure.go +++ b/pkg/modules/migration/create_from_structure.go @@ -59,6 +59,7 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err // First create the related tasks if they does not exist for _, rt := range tasks { if rt.ID == 0 { + rt.ListID = t.ListID err = rt.Create(user) if err != nil { return diff --git a/pkg/modules/migration/create_from_structure_test.go b/pkg/modules/migration/create_from_structure_test.go new file mode 100644 index 000000000..73a0eb666 --- /dev/null +++ b/pkg/modules/migration/create_from_structure_test.go @@ -0,0 +1,80 @@ +// Vikunja is a todo-list application to facilitate your life. +// Copyright 2018-2020 Vikunja and contributors. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package migration + +import ( + "code.vikunja.io/api/pkg/db" + "code.vikunja.io/api/pkg/files" + "code.vikunja.io/api/pkg/models" + "code.vikunja.io/api/pkg/user" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestInsertFromStructure(t *testing.T) { + u := &user.User{ + ID: 1, + } + t.Run("normal", func(t *testing.T) { + db.LoadAndAssertFixtures(t) + testStructure := []*models.NamespaceWithLists{ + { + Namespace: models.Namespace{ + Name: "Test1", + Description: "Lorem Ipsum", + }, + Lists: []*models.List{ + { + Title: "Testlist1", + Description: "Something", + Tasks: []*models.Task{ + { + Text: "Task1", + Description: "Lorem", + }, + { + Text: "Task with related tasks", + RelatedTasks: map[models.RelationKind][]*models.Task{ + models.RelationKindSubtask: { + { + Text: "Related to task with related task", + Description: "As subtask", + }, + }, + }, + }, + { + Text: "Task with attachments", + Attachments: []*models.TaskAttachment{ + { + File: &files.File{ + Name: "testfile", + Size: 4, + FileContent: []byte{1, 2, 3, 4}, + }, + }, + }, + }, + }, + }, + }, + }, + } + err := InsertFromStructure(testStructure, u) + assert.NoError(t, err) + }) +} diff --git a/pkg/modules/migration/main_test.go b/pkg/modules/migration/main_test.go new file mode 100644 index 000000000..75e6462ae --- /dev/null +++ b/pkg/modules/migration/main_test.go @@ -0,0 +1,40 @@ +// Vikunja is a todo-list application to facilitate your life. +// Copyright 2018-2020 Vikunja and contributors. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package migration + +import ( + "code.vikunja.io/api/pkg/config" + "code.vikunja.io/api/pkg/files" + "code.vikunja.io/api/pkg/models" + "code.vikunja.io/api/pkg/user" + "os" + "testing" +) + +// TestMain is the main test function used to bootstrap the test env +func TestMain(m *testing.M) { + // Set default config + config.InitDefaultConfig() + // We need to set the root path even if we're not using the config, otherwise fixtures are not loaded correctly + config.ServiceRootpath.Set(os.Getenv("VIKUNJA_SERVICE_ROOTPATH")) + + // Some tests use the file engine, so we'll need to initialize that + files.InitTests() + user.InitTests() + models.SetupTests() + os.Exit(m.Run()) +} -- 2.40.1 From 2d137e3b7ddaa73ae5908b94b37cedee500afbe4 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 18 Feb 2020 22:24:10 +0100 Subject: [PATCH 2/4] Add better logging --- .../migration/create_from_structure.go | 24 +++++++++++++++++++ .../migration/wunderlist/wunderlist.go | 5 +++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/pkg/modules/migration/create_from_structure.go b/pkg/modules/migration/create_from_structure.go index 58f78010c..df699734d 100644 --- a/pkg/modules/migration/create_from_structure.go +++ b/pkg/modules/migration/create_from_structure.go @@ -18,6 +18,7 @@ package migration import ( "bytes" + "code.vikunja.io/api/pkg/log" "code.vikunja.io/api/pkg/models" "code.vikunja.io/api/pkg/user" "io/ioutil" @@ -27,6 +28,8 @@ import ( // (Namespaces, tasks, etc. Even attachments and relations.) func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err error) { + log.Debugf("[creating structure] Creating %d namespaces", len(str)) + // Create all namespaces for _, n := range str { err = n.Create(user) @@ -34,6 +37,9 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err return } + log.Debugf("[creating structure] Created namespace %d", n.ID) + log.Debugf("[creating structure] Creating %d lists", len(n.Lists)) + // Create all lists for _, l := range n.Lists { // The tasks slice is going to be reset during the creation of the list so we rescue it here to be able @@ -46,6 +52,9 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err return } + log.Debugf("[creating structure] Created list %d", l.ID) + log.Debugf("[creating structure] Creating %d tasks", len(tasks)) + // Create all tasks for _, t := range tasks { t.ListID = l.ID @@ -54,6 +63,11 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err return } + log.Debugf("[creating structure] Created task %d", t.ID) + if len(t.RelatedTasks) > 0 { + log.Debugf("[creating structure] Creating %d related tasks", len(t.RelatedTasks)) + } + // Create all relation for each task for kind, tasks := range t.RelatedTasks { // First create the related tasks if they does not exist @@ -64,6 +78,7 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err if err != nil { return } + log.Debugf("[creating structure] Created related task %d", rt.ID) } // Then create the relation @@ -76,10 +91,16 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err if err != nil { return } + + log.Debugf("[creating structure] Created task relation between task %d and %d with new ID %d", t.ID, rt.ID, taskRel.ID) + } } // Create all attachments for each task + if len(t.Attachments) > 0 { + log.Debugf("[creating structure] Creating %d attachments", len(t.Attachments)) + } for _, a := range t.Attachments { // Check if we have a file to create if len(a.File.FileContent) > 0 { @@ -89,11 +110,14 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err if err != nil { return } + log.Debugf("[creating structure] Created new attachment %d", a.ID) } } } } } + log.Debugf("[creating structure] Done inserting new task structure") + return nil } diff --git a/pkg/modules/migration/wunderlist/wunderlist.go b/pkg/modules/migration/wunderlist/wunderlist.go index b802fcfc2..6f09dc99c 100644 --- a/pkg/modules/migration/wunderlist/wunderlist.go +++ b/pkg/modules/migration/wunderlist/wunderlist.go @@ -459,11 +459,14 @@ func (w *Migration) Migrate(user *user.User) (err error) { log.Debugf("[Wunderlist migration] Insert data into db for user %d", user.ID) err = migration.InsertFromStructure(fullVikunjaHierachie, user) + if err != nil { + return err + } log.Debugf("[Wunderlist migration] Done inserting data into db for user %d", user.ID) log.Debugf("[Wunderlist migration] Wunderlist migration for user %d done", user.ID) - return err + return nil } // AuthURL returns the url users need to authenticate against -- 2.40.1 From 09eaf16d87f023597444be45a6515cc28cf961e2 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 18 Feb 2020 22:31:53 +0100 Subject: [PATCH 3/4] Fix creating related tasks --- pkg/modules/migration/create_from_structure.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/pkg/modules/migration/create_from_structure.go b/pkg/modules/migration/create_from_structure.go index df699734d..f57e235fa 100644 --- a/pkg/modules/migration/create_from_structure.go +++ b/pkg/modules/migration/create_from_structure.go @@ -65,13 +65,18 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err log.Debugf("[creating structure] Created task %d", t.ID) if len(t.RelatedTasks) > 0 { - log.Debugf("[creating structure] Creating %d related tasks", len(t.RelatedTasks)) + log.Debugf("[creating structure] Creating %d related task kinds", len(t.RelatedTasks)) } // Create all relation for each task for kind, tasks := range t.RelatedTasks { - // First create the related tasks if they does not exist + + if len(tasks) > 0 { + log.Debugf("[creating structure] Creating %d related tasks for kind %v", len(tasks), kind) + } + for _, rt := range tasks { + // First create the related tasks if they does not exist if rt.ID == 0 { rt.ListID = t.ListID err = rt.Create(user) @@ -83,8 +88,8 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err // Then create the relation taskRel := &models.TaskRelation{ - TaskID: rt.ID, - OtherTaskID: t.ID, + TaskID: t.ID, + OtherTaskID: rt.ID, RelationKind: kind, } err = taskRel.Create(user) @@ -92,7 +97,7 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err return } - log.Debugf("[creating structure] Created task relation between task %d and %d with new ID %d", t.ID, rt.ID, taskRel.ID) + log.Debugf("[creating structure] Created task relation between task %d and %d", t.ID, rt.ID) } } -- 2.40.1 From d6f9f4ece73bb670a3ca1ea4c764b899b87ef466 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 18 Feb 2020 22:42:47 +0100 Subject: [PATCH 4/4] [skip ci] Fix typo --- pkg/modules/migration/create_from_structure.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/modules/migration/create_from_structure.go b/pkg/modules/migration/create_from_structure.go index f57e235fa..903ee08a2 100644 --- a/pkg/modules/migration/create_from_structure.go +++ b/pkg/modules/migration/create_from_structure.go @@ -76,7 +76,7 @@ func InsertFromStructure(str []*models.NamespaceWithLists, user *user.User) (err } for _, rt := range tasks { - // First create the related tasks if they does not exist + // First create the related tasks if they do not exist if rt.ID == 0 { rt.ListID = t.ListID err = rt.Create(user) -- 2.40.1