From 8b2a43edce196337bcd2fbae76b0e9a9bcc8aa99 Mon Sep 17 00:00:00 2001 From: Christophe Ninucci Date: Mon, 31 Jul 2023 18:41:25 +0200 Subject: [PATCH 1/3] - ArchiveCard + test - test UnarchiveCard - test UpdateCardDescription - update de modifiedAt & dateLastActivity pour les fonctions Archive/Unarchive/UpdateCardDescription - fix User.CreateAt -> User.CreatedAt --- cards.go | 31 ++++++++- cards_integration_test.go | 131 ++++++++++++++++++++++++++++++++++++++ users.go | 6 +- 3 files changed, 164 insertions(+), 4 deletions(-) diff --git a/cards.go b/cards.go index aa8c4f3..cf11948 100644 --- a/cards.go +++ b/cards.go @@ -417,6 +417,30 @@ func (wekan *Wekan) BuildCardFromCustomTextFieldsPipeline(name string, values [] return pipeline } +func (wekan *Wekan) ArchiveCard(ctx context.Context, cardID CardID) error { + update, err := wekan.db.Collection("cards").UpdateOne(ctx, bson.M{ + "_id": cardID, + }, bson.M{ + "$set": bson.M{ + "archived": true, + }, + "$currentDate": bson.M{ + "modifiedAt": true, + "dateLastActivity": true, + }, + }) + if err != nil { + return UnexpectedMongoError{err} + } + if update.MatchedCount == 0 { + return CardNotFoundError{cardID} + } + if update.ModifiedCount == 0 { + return NothingDoneError{} + } + return nil +} + func (wekan *Wekan) UnarchiveCard(ctx context.Context, cardID CardID) error { update, err := wekan.db.Collection("cards").UpdateOne(ctx, bson.M{ "_id": cardID, @@ -424,6 +448,10 @@ func (wekan *Wekan) UnarchiveCard(ctx context.Context, cardID CardID) error { "$set": bson.M{ "archived": false, }, + "$currentDate": bson.M{ + "modifiedAt": true, + "dateLastActivity": true, + }, }) if err != nil { return UnexpectedMongoError{err} @@ -456,7 +484,8 @@ func (wekan *Wekan) UpdateCardDescription(ctx context.Context, cardID CardID, de "description": description, }, "$currentDate": bson.M{ - "modifiedAt": true, + "modifiedAt": true, + "dateLastActivity": true, }, }, ) diff --git a/cards_integration_test.go b/cards_integration_test.go index f6aa452..1e1c085 100644 --- a/cards_integration_test.go +++ b/cards_integration_test.go @@ -20,6 +20,7 @@ func getElement[Element any](elements []Element, fn func(element Element) bool) return nil } +// createTestCard crée un objet de type `Card`, l'insère dans la base de test et le retourne func createTestCard(t *testing.T, userID UserID, boardID *BoardID, swimlaneID *SwimlaneID, listID *ListID) Card { ctx := context.Background() var board Board @@ -268,3 +269,133 @@ func TestCards_AddLabelToCard_whenLabelAlreadyOnBard(t *testing.T) { ass.Contains(actualCard.LabelIDs, boardLabel.ID) ass.Len(actualCard.LabelIDs, 1) } + +func TestCards_ArchiveCard(t *testing.T) { + ass := assert.New(t) + + //GIVEN + board, swimlanes, lists := createTestBoard(t, "", 1, 1) + card := createTestCard(t, wekan.adminUserID, &board.ID, &(swimlanes[0].ID), &(lists[0].ID)) + + //WHEN + wekan.ArchiveCard(ctx, card.ID) + actualCard, err := wekan.GetCardFromID(ctx, card.ID) + ass.Nil(err) + + //THEN + ass.Greater(actualCard.ModifiedAt, card.ModifiedAt) + ass.Greater(actualCard.DateLastActivity, card.DateLastActivity) + ass.True(actualCard.Archived) +} + +func TestCards_ArchiveCard_whenCardAlreadyArchived(t *testing.T) { + ass := assert.New(t) + + //GIVEN + board, swimlanes, lists := createTestBoard(t, "", 1, 1) + card := createTestCard(t, wekan.adminUserID, &board.ID, &(swimlanes[0].ID), &(lists[0].ID)) + wekan.ArchiveCard(ctx, card.ID) + archivedCard, err := wekan.GetCardFromID(ctx, card.ID) + ass.Nil(err) + + //WHEN + err = wekan.ArchiveCard(ctx, archivedCard.ID) + + //THEN + ass.ErrorAs(err, &NothingDoneError{}) +} + +func TestCards_ArchiveCard_whenCardDoesNotExists(t *testing.T) { + ass := assert.New(t) + + //GIVEN + unknownCardID := CardID(t.Name() + "not an actual ID") + + //WHEN + err := wekan.ArchiveCard(ctx, unknownCardID) + + //THEN + ass.ErrorAs(err, &CardNotFoundError{}) +} + +func TestCards_UnarchiveCard(t *testing.T) { + ass := assert.New(t) + + //GIVEN + board, swimlanes, lists := createTestBoard(t, "", 1, 1) + card := createTestCard(t, wekan.adminUserID, &board.ID, &(swimlanes[0].ID), &(lists[0].ID)) + archivedCard, err := wekan.GetCardFromID(ctx, card.ID) + ass.Nil(err) + + //WHEN + wekan.UnarchiveCard(ctx, archivedCard.ID) + actualCard, err := wekan.GetCardFromID(ctx, card.ID) + ass.Nil(err) + + //THEN + ass.Greater(actualCard.ModifiedAt, card.ModifiedAt) + ass.Greater(actualCard.DateLastActivity, card.DateLastActivity) + ass.False(actualCard.Archived) +} + +func TestCards_UnarchiveCard_whenCardNotArchived(t *testing.T) { + ass := assert.New(t) + + //GIVEN + board, swimlanes, lists := createTestBoard(t, "", 1, 1) + card := createTestCard(t, wekan.adminUserID, &board.ID, &(swimlanes[0].ID), &(lists[0].ID)) + + //WHEN + err := wekan.UnarchiveCard(ctx, card.ID) + + //THEN + ass.ErrorAs(err, &NothingDoneError{}) +} + +func TestCards_UnarchiveCard_whenCardDoesNotExists(t *testing.T) { + ass := assert.New(t) + + //GIVEN + unknownCardID := CardID(t.Name() + "not an actual ID") + + //WHEN + err := wekan.UnarchiveCard(ctx, unknownCardID) + + //THEN + ass.ErrorAs(err, &CardNotFoundError{}) +} + +func TestCards_UpdateCardDescription(t *testing.T) { + ass := assert.New(t) + + //GIVEN + board, swimlanes, lists := createTestBoard(t, "", 1, 1) + card := createTestCard(t, wekan.adminUserID, &board.ID, &(swimlanes[0].ID), &(lists[0].ID)) + description := "description originale" + wekan.UpdateCardDescription(ctx, card.ID, description) + + // WHEN + newDescription := "nouvelle description" + err := wekan.UpdateCardDescription(ctx, card.ID, newDescription) + ass.Nil(err) + + //THEN + actualCard, err := wekan.GetCardFromID(ctx, card.ID) + ass.Nil(err) + ass.Equal(newDescription, actualCard.Description) + ass.Greater(actualCard.ModifiedAt, card.ModifiedAt) + ass.Greater(actualCard.DateLastActivity, card.DateLastActivity) +} + +func TestCards_UpdateCardDescription_WhenCardDoesntExists(t *testing.T) { + ass := assert.New(t) + + //GIVEN + unknownCardID := CardID(t.Name() + "not an actual ID") + + // WHEN + err := wekan.UpdateCardDescription(ctx, unknownCardID, "") + + //THEN + ass.ErrorAs(err, &CardNotFoundError{}) +} diff --git a/users.go b/users.go index fb7dd3c..140504a 100644 --- a/users.go +++ b/users.go @@ -16,7 +16,7 @@ type Users []User type User struct { ID UserID `bson:"_id"` - CreateAt time.Time `bson:"createAt"` + CreatedAt time.Time `bson:"createAt"` Services UserServices `bson:"services"` Username Username `bson:"username"` Emails []UserEmail `bson:"emails"` @@ -299,8 +299,8 @@ func (user *User) BuildTemplates() UserTemplates { // BuildUser retourne un objet User à insérer/updater avec la fonction Wekan.UpsertUser func BuildUser(email, initials, fullname string) User { newUser := User{ - ID: UserID(newId()), - CreateAt: time.Now(), + ID: UserID(newId()), + CreatedAt: time.Now(), Services: UserServices{ OIDC: UserServicesOIDC{ From 9e335342dcd7addd8f5508b56c88e22b327ba0f7 Mon Sep 17 00:00:00 2001 From: Christophe Ninucci Date: Mon, 31 Jul 2023 21:50:02 +0200 Subject: [PATCH 2/3] fix test & adapt function --- cards.go | 6 ++++-- cards_integration_test.go | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cards.go b/cards.go index cf11948..0a91f64 100644 --- a/cards.go +++ b/cards.go @@ -419,7 +419,8 @@ func (wekan *Wekan) BuildCardFromCustomTextFieldsPipeline(name string, values [] func (wekan *Wekan) ArchiveCard(ctx context.Context, cardID CardID) error { update, err := wekan.db.Collection("cards").UpdateOne(ctx, bson.M{ - "_id": cardID, + "_id": cardID, + "archived": false, }, bson.M{ "$set": bson.M{ "archived": true, @@ -443,7 +444,8 @@ func (wekan *Wekan) ArchiveCard(ctx context.Context, cardID CardID) error { func (wekan *Wekan) UnarchiveCard(ctx context.Context, cardID CardID) error { update, err := wekan.db.Collection("cards").UpdateOne(ctx, bson.M{ - "_id": cardID, + "_id": cardID, + "archived": true, }, bson.M{ "$set": bson.M{ "archived": false, diff --git a/cards_integration_test.go b/cards_integration_test.go index 1e1c085..f2ada96 100644 --- a/cards_integration_test.go +++ b/cards_integration_test.go @@ -302,7 +302,7 @@ func TestCards_ArchiveCard_whenCardAlreadyArchived(t *testing.T) { err = wekan.ArchiveCard(ctx, archivedCard.ID) //THEN - ass.ErrorAs(err, &NothingDoneError{}) + ass.ErrorAs(err, &CardNotFoundError{}) } func TestCards_ArchiveCard_whenCardDoesNotExists(t *testing.T) { @@ -349,7 +349,7 @@ func TestCards_UnarchiveCard_whenCardNotArchived(t *testing.T) { err := wekan.UnarchiveCard(ctx, card.ID) //THEN - ass.ErrorAs(err, &NothingDoneError{}) + ass.ErrorAs(err, &CardNotFoundError{}) } func TestCards_UnarchiveCard_whenCardDoesNotExists(t *testing.T) { From b0e55d1a07fe1c3612e8b82a50a8e39598749add Mon Sep 17 00:00:00 2001 From: Christophe Ninucci Date: Mon, 31 Jul 2023 21:56:12 +0200 Subject: [PATCH 3/3] fix unarchivecard test --- cards_integration_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cards_integration_test.go b/cards_integration_test.go index f2ada96..22b65f8 100644 --- a/cards_integration_test.go +++ b/cards_integration_test.go @@ -324,11 +324,13 @@ func TestCards_UnarchiveCard(t *testing.T) { //GIVEN board, swimlanes, lists := createTestBoard(t, "", 1, 1) card := createTestCard(t, wekan.adminUserID, &board.ID, &(swimlanes[0].ID), &(lists[0].ID)) + wekan.ArchiveCard(ctx, card.ID) archivedCard, err := wekan.GetCardFromID(ctx, card.ID) ass.Nil(err) //WHEN - wekan.UnarchiveCard(ctx, archivedCard.ID) + err = wekan.UnarchiveCard(ctx, archivedCard.ID) + ass.Nil(err) actualCard, err := wekan.GetCardFromID(ctx, card.ID) ass.Nil(err)