Skip to content
This repository has been archived by the owner on Jan 22, 2025. It is now read-only.

Commit

Permalink
fix(admin-api): delete published version on unpublish action (#214)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexrodfe authored Dec 5, 2023
1 parent ce81e96 commit a9a421e
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 2 deletions.
15 changes: 15 additions & 0 deletions engine/admin-api/domain/usecase/version/unpublish.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,21 @@ func (h *Handler) Unpublish(
)
}

product, err := h.productRepo.GetByID(ctx, productID)
if err != nil {
return nil, err
}

product.RemovePublishedVersion()

err = h.productRepo.Update(context.Background(), product)
if err != nil {
h.logger.Error(err, "Error updating product published version",
"productID", productID,
"publishedVersion", vers.Tag,
)
}

err = h.userActivityInteractor.RegisterUnpublishAction(user.Email, productID, vers, comment)
if err != nil {
h.logger.Error(err, "Error registering user activity",
Expand Down
42 changes: 40 additions & 2 deletions engine/admin-api/domain/usecase/version/unpublish_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,17 @@ func (s *versionSuite) TestUnpublish_OK() {
WithTag(versionTag).
WithStatus(entity.VersionStatusPublished).
Build()
product := testhelpers.NewProductBuilder().
WithPublishedVersion(&vers.Tag).
Build()

s.accessControl.EXPECT().CheckProductGrants(user, productID, auth.ActUnpublishVersion).Return(nil)
s.versionRepo.EXPECT().GetByTag(ctx, productID, versionTag).Return(vers, nil)
s.productRepo.EXPECT().GetByID(ctx, productID).Return(product, nil)

s.versionService.EXPECT().Unpublish(ctx, productID, vers).Return(nil)
s.versionRepo.EXPECT().Update(productID, vers).Return(nil)
s.productRepo.EXPECT().Update(ctx, product)
s.userActivityInteractor.EXPECT().RegisterUnpublishAction(user.Email, productID, vers, "unpublishing").Return(nil)

// WHEN unpublishing the version
Expand All @@ -37,6 +42,7 @@ func (s *versionSuite) TestUnpublish_OK() {
s.Equal(entity.VersionStatusStarted, unpublishedVer.Status)
s.Nil(unpublishedVer.PublicationAuthor)
s.Nil(unpublishedVer.PublicationDate)
s.False(product.HasVersionPublished()) // product is a pointer, so it's updated
}

func (s *versionSuite) TestUnpublish_ErrorUserNotAuthorized() {
Expand Down Expand Up @@ -91,6 +97,29 @@ func (s *versionSuite) TestUnpublish_ErrorVersionCannotBeUnpublished() {
s.ErrorIs(err, version.ErrVersionCannotBeUnpublished)
}

func (s *versionSuite) TestUnpublish_ErrorProductNotFound() {
// GIVEN a valid user and a published version, but product not found
ctx := context.Background()
user := testhelpers.NewUserBuilder().Build()
vers := testhelpers.NewVersionBuilder().
WithTag(versionTag).
WithStatus(entity.VersionStatusPublished).
Build()

s.accessControl.EXPECT().CheckProductGrants(user, productID, auth.ActUnpublishVersion).Return(nil)
s.versionRepo.EXPECT().GetByTag(ctx, productID, versionTag).Return(vers, nil)
s.productRepo.EXPECT().GetByID(ctx, productID).Return(nil, fmt.Errorf("no product found"))

s.versionService.EXPECT().Unpublish(ctx, productID, vers).Return(nil)
s.versionRepo.EXPECT().Update(productID, vers).Return(nil)

// WHEN unpublishing the version
_, err := s.handler.Unpublish(ctx, user, productID, versionTag, "unpublishing")

// THEN an error is returned
s.Error(err)
}

func (s *versionSuite) TestUnpublish_ErrorUnpublishingVersion() {
// GIVEN a valid user and a published version, but error during unpublishing
ctx := context.Background()
Expand Down Expand Up @@ -121,25 +150,34 @@ func (s *versionSuite) TestUnpublish_CheckNonBlockingErrorLogging() {
WithTag(versionTag).
WithStatus(entity.VersionStatusPublished).
Build()
product := testhelpers.NewProductBuilder().
WithPublishedVersion(&vers.Tag).
Build()

setStatusErr := errors.New("error updating version status")
updateProductErr := errors.New("error updating product published version")
registerActionErr := errors.New("error registering unpublish action")

s.accessControl.EXPECT().CheckProductGrants(user, productID, auth.ActUnpublishVersion).Return(nil)
s.versionRepo.EXPECT().GetByTag(ctx, productID, versionTag).Return(vers, nil)
s.productRepo.EXPECT().GetByID(ctx, productID).Return(product, nil)

s.versionService.EXPECT().Unpublish(ctx, productID, vers).Return(nil)
s.versionRepo.EXPECT().Update(productID, vers).Return(setStatusErr)
s.productRepo.EXPECT().Update(ctx, product).Return(updateProductErr)
s.userActivityInteractor.EXPECT().RegisterUnpublishAction(user.Email, productID, vers, "unpublishing").Return(registerActionErr)

// WHEN unpublishing the version
_, err := s.handler.Unpublish(ctx, user, productID, versionTag, "unpublishing")
s.NoError(err)

s.Require().Len(s.observedLogs.All(), 3)
s.Require().Len(s.observedLogs.All(), 4)
print(s.observedLogs.All())
log1 := s.observedLogs.All()[1]
s.Equal(log1.ContextMap()["error"], setStatusErr.Error())
log2 := s.observedLogs.All()[2]
s.Equal(log2.ContextMap()["error"], registerActionErr.Error())
s.Equal(log2.ContextMap()["error"], updateProductErr.Error())
log3 := s.observedLogs.All()[3]
s.Equal(log3.ContextMap()["error"], registerActionErr.Error())

}

0 comments on commit a9a421e

Please sign in to comment.