From 35ac37313d02f1254269ab9b5311f1a58523d8a3 Mon Sep 17 00:00:00 2001 From: Abin Simon Date: Mon, 8 Jan 2024 16:41:02 +0530 Subject: [PATCH] Return proper error when backups are empty for details command (#4968) --- #### Does this PR need a docs update or release note? - [x] :white_check_mark: Yes, it's included - [ ] :clock1: Yes, but in a later PR - [ ] :no_entry: No #### Type of change - [ ] :sunflower: Feature - [ ] :bug: Bugfix - [ ] :world_map: Documentation - [ ] :robot: Supportability/Tests - [ ] :computer: CI/Deployment - [x] :broom: Tech Debt/Cleanup #### Issue(s) * # #### Test Plan - [ ] :muscle: Manual - [x] :zap: Unit test - [ ] :green_heart: E2E --- CHANGELOG.md | 3 +++ src/cli/backup/backup.go | 6 ++++++ src/cli/backup/backup_test.go | 29 +++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96153f31d..d4cb9534d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] (beta) +### Changed +- When running `backup details` on an empty backup returns a more helpful error message. + ## [v0.18.0] (beta) - 2024-01-02 ### Fixed diff --git a/src/cli/backup/backup.go b/src/cli/backup/backup.go index fa22396b9..c95d5803d 100644 --- a/src/cli/backup/backup.go +++ b/src/cli/backup/backup.go @@ -28,6 +28,8 @@ import ( "github.com/alcionai/corso/src/pkg/store" ) +var ErrEmptyBackup = clues.New("no items in backup") + // --------------------------------------------------------------------------- // adding commands to cobra // --------------------------------------------------------------------------- @@ -394,6 +396,10 @@ func genericDetailsCore( return nil, clues.Wrap(errs.Failure(), "Failed to get backup details in the repository") } + if len(d.Entries) == 0 { + return nil, ErrEmptyBackup + } + if opts.SkipReduce { return d, nil } diff --git a/src/cli/backup/backup_test.go b/src/cli/backup/backup_test.go index 4d70702ae..c33cae150 100644 --- a/src/cli/backup/backup_test.go +++ b/src/cli/backup/backup_test.go @@ -5,10 +5,12 @@ import ( "github.com/alcionai/clues" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" "github.com/alcionai/corso/src/cli/utils/testdata" "github.com/alcionai/corso/src/internal/tester" + "github.com/alcionai/corso/src/pkg/backup/details" dtd "github.com/alcionai/corso/src/pkg/backup/details/testdata" "github.com/alcionai/corso/src/pkg/control" "github.com/alcionai/corso/src/pkg/path" @@ -66,3 +68,30 @@ func (suite *BackupUnitSuite) TestGenericDetailsCore() { assert.NoError(t, err, clues.ToCore(err)) assert.ElementsMatch(t, expected, output.Entries) } + +func (suite *BackupUnitSuite) TestGenericDetailsCore_empty() { + t := suite.T() + + ctx, flush := tester.NewContext(t) + defer flush() + + bg := testdata.VersionedBackupGetter{ + Details: &details.Details{ + DetailsModel: details.DetailsModel{ + Entries: []details.Entry{}, + }, + }, + } + + sel := selectors.NewExchangeBackup([]string{"user-id"}) + sel.Include(sel.AllData()) + + _, err := genericDetailsCore( + ctx, + bg, + "backup-ID", + sel.Selector, + control.DefaultOptions()) + require.Error(t, err, "has error") + assert.ErrorIs(t, err, ErrEmptyBackup, clues.ToCore(err)) +}