From 3ae329925beded949f741d6d74f5c36bfa55b819 Mon Sep 17 00:00:00 2001 From: Vitaliy Vasylenko Date: Mon, 12 Aug 2024 11:18:41 -0400 Subject: [PATCH] feat: Add update for agent --- cmd/oneauth/commands/cmd_update.go | 19 +++++-- internal/updates/version.go | 22 ++++++++ internal/updates/version_test.go | 80 +++++++++++++++++++++++++++++- 3 files changed, 116 insertions(+), 5 deletions(-) diff --git a/cmd/oneauth/commands/cmd_update.go b/cmd/oneauth/commands/cmd_update.go index 1e763c7..de9afec 100644 --- a/cmd/oneauth/commands/cmd_update.go +++ b/cmd/oneauth/commands/cmd_update.go @@ -52,10 +52,21 @@ var updateCmd = &cli.Command{ return fmt.Errorf("update version mismatch: %s != %s", versionManifest.Version, manifest.Version) } - fmt.Printf( - "New version available: (current: %s; channel: %s) %s\n", - buildinfo.Version, updates.GetChannelName(buildinfo.Version), manifest.Version, - ) + newVersion, err := updates.CheckNewVersion(buildinfo.Version, manifest.Version) + if err != nil { + return fmt.Errorf("failed to check new version: %w", err) + } + + if newVersion { + fmt.Printf( + "New version available: (current: %s; channel: %s) %s\n", + buildinfo.Version, + updates.GetChannelName(buildinfo.Version), + manifest.Version, + ) + } else { + fmt.Println("No update available") + } return nil }, diff --git a/internal/updates/version.go b/internal/updates/version.go index 5953238..805baf1 100644 --- a/internal/updates/version.go +++ b/internal/updates/version.go @@ -20,3 +20,25 @@ func checkVersion(version string) (*semver.Constraints, error) { return semver.NewConstraint(fmt.Sprintf(">=%s", version)) } + +func CheckNewVersion(currentVersion, newVersion string) (bool, error) { + if _, err := checkVersion(currentVersion); err != nil { + return false, fmt.Errorf("failed to check current version: %w", err) + } + + if _, err := checkVersion(newVersion); err != nil { + return false, fmt.Errorf("failed to check new version: %w", err) + } + + c, err := semver.NewConstraint(fmt.Sprintf(">%s", currentVersion)) + if err != nil { + return false, fmt.Errorf("failed to create constraint: %w", err) + } + + v, err := semver.NewVersion(newVersion) + if err != nil { + return false, fmt.Errorf("failed to create version: %w", err) + } + + return c.Check(v), nil +} diff --git a/internal/updates/version_test.go b/internal/updates/version_test.go index 8e77d43..d8548b8 100644 --- a/internal/updates/version_test.go +++ b/internal/updates/version_test.go @@ -1,6 +1,10 @@ package updates -import "testing" +import ( + "testing" + + "github.com/stretchr/testify/assert" +) func TestCheckVersion(t *testing.T) { tests := []struct { @@ -35,3 +39,77 @@ func TestCheckVersion(t *testing.T) { }) } } + +func TestCheckNewVersion(t *testing.T) { + tests := []struct { + name string + currentVersion string + newVersion string + expectedResult bool + expectError bool + }{ + { + name: "New version is greater", + currentVersion: "v1.0.0", + newVersion: "v1.1.0", + expectedResult: true, + expectError: false, + }, + { + name: "New version is equal", + currentVersion: "v1.0.0", + newVersion: "v1.0.0", + expectedResult: false, + expectError: false, + }, + { + name: "New version is lower", + currentVersion: "v1.1.0", + newVersion: "v1.0.0", + expectedResult: false, + expectError: false, + }, + { + name: "Invalid current version", + currentVersion: "invalid", + newVersion: "v1.1.0", + expectedResult: false, + expectError: true, + }, + { + name: "Invalid new version", + currentVersion: "v1.0.0", + newVersion: "invalid", + expectedResult: false, + expectError: true, + }, + { + name: "Empty current version", + currentVersion: "", + newVersion: "v1.1.0", + expectedResult: false, + expectError: true, + }, + { + name: "Empty new version", + currentVersion: "v1.0.0", + newVersion: "", + expectedResult: false, + expectError: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := CheckNewVersion(tt.currentVersion, tt.newVersion) + + if tt.expectError { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + + assert.Equal(t, tt.expectedResult, result) + }) + } +}