From 227a44e5fa23ef3c16ad91726b86f00164cf5753 Mon Sep 17 00:00:00 2001 From: Simon Herrmann Date: Thu, 18 Dec 2025 20:00:24 +0100 Subject: [PATCH 1/4] update: add role validity check, add tests for role validity check --- cli/cmd/register.go | 40 ++++++++++++++++++++++------------------ cli/cmd/register_test.go | 28 ++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/cli/cmd/register.go b/cli/cmd/register.go index c1939ec..a7a1a40 100644 --- a/cli/cmd/register.go +++ b/cli/cmd/register.go @@ -39,24 +39,6 @@ func (c *RegisterCmd) RunE(_ *cobra.Command, args []string) error { return nil } -func (c *RegisterCmd) Register(p portal.Portal) (*portal.ApiKey, error) { - var err error - var expiresAt time.Time - if c.Opts.ExpiresAt != "" { - expiresAt, err = time.Parse(time.RFC3339, c.Opts.ExpiresAt) - if err != nil { - return nil, fmt.Errorf("failed to parse expiration date: %w", err) - } - } - - newKey, err := p.RegisterAPIKey(c.Opts.Owner, c.Opts.Organization, c.Opts.Role, expiresAt) - if err != nil { - return nil, fmt.Errorf("failed to register API key: %w", err) - } - - return newKey, nil -} - func AddRegisterCmd(list *cobra.Command, opts *GlobalOptions) { c := RegisterCmd{ cmd: &cobra.Command{ @@ -75,3 +57,25 @@ func AddRegisterCmd(list *cobra.Command, opts *GlobalOptions) { list.AddCommand(c.cmd) } + +func (c *RegisterCmd) Register(p portal.Portal) (*portal.ApiKey, error) { + if c.Opts.Role != "Admin" && c.Opts.Role != "Dev" && c.Opts.Role != "Ext" { + return nil, fmt.Errorf("invalid role: %s. Available roles are: Admin, Dev, Ext", c.Opts.Role) + } + + var err error + var expiresAt time.Time + if c.Opts.ExpiresAt != "" { + expiresAt, err = time.Parse(time.RFC3339, c.Opts.ExpiresAt) + if err != nil { + return nil, fmt.Errorf("failed to parse expiration date: %w", err) + } + } + + newKey, err := p.RegisterAPIKey(c.Opts.Owner, c.Opts.Organization, c.Opts.Role, expiresAt) + if err != nil { + return nil, fmt.Errorf("failed to register API key: %w", err) + } + + return newKey, nil +} diff --git a/cli/cmd/register_test.go b/cli/cmd/register_test.go index e3a9bd0..8924d17 100644 --- a/cli/cmd/register_test.go +++ b/cli/cmd/register_test.go @@ -30,7 +30,7 @@ var _ = Describe("RegisterCmd", func() { expiresAt = "2025-05-01T15:04:05Z" owner = "test-owner" organization = "test-org" - role = "admin" + role = "Admin" c = cmd.RegisterCmd{ Opts: cmd.RegisterOpts{ Owner: owner, @@ -60,15 +60,35 @@ var _ = Describe("RegisterCmd", func() { }) Context("when expiration date is invalid", func() { - BeforeEach(func() { - c.Opts.ExpiresAt = "invalid-date" - }) It("returns error for invalid expiration date", func() { + c.Opts.ExpiresAt = "invalid-date" ak, err := c.Register(mockPortal) Expect(ak).To(BeNil()) Expect(err).To(MatchError(ContainSubstring("failed to parse expiration date"))) }) }) + + Context("when role is valid", func() { + It("accepts Admin role", func() { + c.Opts.Role = "Admin" + parsedTime, _ := time.Parse(time.RFC3339, expiresAt) + + mockPortal.EXPECT().RegisterAPIKey(owner, organization, "Admin", parsedTime).Return(&portal.ApiKey{}, nil) + + ak, err := c.Register(mockPortal) + Expect(err).To(BeNil()) + Expect(ak).NotTo(BeNil()) + }) + }) + + Context("when role is invalid", func() { + It("returns error for invalid role", func() { + c.Opts.Role = "InvalidRole" + ak, err := c.Register(mockPortal) + Expect(ak).To(BeNil()) + Expect(err).To(MatchError(ContainSubstring("invalid role: InvalidRole"))) + }) + }) }) var _ = Describe("AddRegisterCmd", func() { From b3bac21eccc107339d4efff617076005f17c0d3f Mon Sep 17 00:00:00 2001 From: siherrmann <25087590+siherrmann@users.noreply.github.com> Date: Thu, 18 Dec 2025 19:11:29 +0000 Subject: [PATCH 2/4] chore(docs): Auto-update docs and licenses Signed-off-by: siherrmann <25087590+siherrmann@users.noreply.github.com> --- NOTICE | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/NOTICE b/NOTICE index d7e513d..1940199 100644 --- a/NOTICE +++ b/NOTICE @@ -23,9 +23,9 @@ License URL: https://github.com/clipperhouse/uax29/blob/v2.3.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go/pkg/io -Version: v0.14.1 +Version: v0.15.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v0.14.1/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v0.15.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl @@ -77,9 +77,9 @@ License URL: https://github.com/inconshreveable/go-update/blob/8152e7eb6ccf/inte ---------- Module: github.com/jedib0t/go-pretty/v6 -Version: v6.7.5 +Version: v6.7.7 License: MIT -License URL: https://github.com/jedib0t/go-pretty/blob/v6.7.5/LICENSE +License URL: https://github.com/jedib0t/go-pretty/blob/v6.7.7/LICENSE ---------- Module: github.com/mattn/go-runewidth @@ -155,9 +155,9 @@ License URL: https://github.com/yaml/go-yaml/blob/v3.0.4/LICENSE ---------- Module: golang.org/x/crypto -Version: v0.45.0 +Version: v0.46.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/crypto/+/v0.45.0:LICENSE +License URL: https://cs.opensource.google/go/x/crypto/+/v0.46.0:LICENSE ---------- Module: golang.org/x/oauth2 @@ -167,9 +167,9 @@ License URL: https://cs.opensource.google/go/x/oauth2/+/v0.33.0:LICENSE ---------- Module: golang.org/x/text -Version: v0.31.0 +Version: v0.32.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/text/+/v0.31.0:LICENSE +License URL: https://cs.opensource.google/go/x/text/+/v0.32.0:LICENSE ---------- Module: gopkg.in/yaml.v3 From 521fe4f2e4b9231cfb5ffed953406d0ceb462d72 Mon Sep 17 00:00:00 2001 From: Simon Herrmann Date: Fri, 19 Dec 2025 10:05:38 +0100 Subject: [PATCH 3/4] update: small fixes, add two test cases --- cli/cmd/register.go | 8 +++++++- cli/cmd/register_test.go | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/cli/cmd/register.go b/cli/cmd/register.go index a7a1a40..8577410 100644 --- a/cli/cmd/register.go +++ b/cli/cmd/register.go @@ -12,6 +12,12 @@ import ( "github.com/spf13/cobra" ) +const ( + API_KEY_ROLE_ADMIN = "Admin" + API_KEY_ROLE_DEV = "Dev" + API_KEY_ROLE_EXT = "Ext" +) + type RegisterCmd struct { cmd *cobra.Command Opts RegisterOpts @@ -59,7 +65,7 @@ func AddRegisterCmd(list *cobra.Command, opts *GlobalOptions) { } func (c *RegisterCmd) Register(p portal.Portal) (*portal.ApiKey, error) { - if c.Opts.Role != "Admin" && c.Opts.Role != "Dev" && c.Opts.Role != "Ext" { + if c.Opts.Role != API_KEY_ROLE_ADMIN && c.Opts.Role != API_KEY_ROLE_DEV && c.Opts.Role != API_KEY_ROLE_EXT { return nil, fmt.Errorf("invalid role: %s. Available roles are: Admin, Dev, Ext", c.Opts.Role) } diff --git a/cli/cmd/register_test.go b/cli/cmd/register_test.go index 8924d17..49b6e80 100644 --- a/cli/cmd/register_test.go +++ b/cli/cmd/register_test.go @@ -30,7 +30,7 @@ var _ = Describe("RegisterCmd", func() { expiresAt = "2025-05-01T15:04:05Z" owner = "test-owner" organization = "test-org" - role = "Admin" + role = cmd.API_KEY_ROLE_ADMIN c = cmd.RegisterCmd{ Opts: cmd.RegisterOpts{ Owner: owner, @@ -43,7 +43,8 @@ var _ = Describe("RegisterCmd", func() { Context("when expiration date is valid", func() { It("registers the API key successfully", func() { - parsedTime, _ := time.Parse(time.RFC3339, expiresAt) + parsedTime, err := time.Parse(time.RFC3339, expiresAt) + Expect(err).To(BeNil()) mockPortal.EXPECT().RegisterAPIKey(owner, organization, role, parsedTime).Return(&portal.ApiKey{}, nil) ak, err := c.Register(mockPortal) Expect(err).To(BeNil()) @@ -51,7 +52,8 @@ var _ = Describe("RegisterCmd", func() { }) It("returns error if Register fails", func() { - parsedTime, _ := time.Parse(time.RFC3339, expiresAt) + parsedTime, err := time.Parse(time.RFC3339, expiresAt) + Expect(err).To(BeNil()) mockPortal.EXPECT().RegisterAPIKey(owner, organization, role, parsedTime).Return((*portal.ApiKey)(nil), fmt.Errorf("some error")) ak, err := c.Register(mockPortal) Expect(ak).To(BeNil()) @@ -70,10 +72,35 @@ var _ = Describe("RegisterCmd", func() { Context("when role is valid", func() { It("accepts Admin role", func() { - c.Opts.Role = "Admin" - parsedTime, _ := time.Parse(time.RFC3339, expiresAt) + c.Opts.Role = cmd.API_KEY_ROLE_ADMIN + parsedTime, err := time.Parse(time.RFC3339, expiresAt) + Expect(err).To(BeNil()) + + mockPortal.EXPECT().RegisterAPIKey(owner, organization, cmd.API_KEY_ROLE_ADMIN, parsedTime).Return(&portal.ApiKey{}, nil) + + ak, err := c.Register(mockPortal) + Expect(err).To(BeNil()) + Expect(ak).NotTo(BeNil()) + }) + + It("accepts Dev role", func() { + c.Opts.Role = cmd.API_KEY_ROLE_DEV + parsedTime, err := time.Parse(time.RFC3339, expiresAt) + Expect(err).To(BeNil()) + + mockPortal.EXPECT().RegisterAPIKey(owner, organization, cmd.API_KEY_ROLE_DEV, parsedTime).Return(&portal.ApiKey{}, nil) + + ak, err := c.Register(mockPortal) + Expect(err).To(BeNil()) + Expect(ak).NotTo(BeNil()) + }) + + It("accepts Ext role", func() { + c.Opts.Role = cmd.API_KEY_ROLE_EXT + parsedTime, err := time.Parse(time.RFC3339, expiresAt) + Expect(err).To(BeNil()) - mockPortal.EXPECT().RegisterAPIKey(owner, organization, "Admin", parsedTime).Return(&portal.ApiKey{}, nil) + mockPortal.EXPECT().RegisterAPIKey(owner, organization, cmd.API_KEY_ROLE_EXT, parsedTime).Return(&portal.ApiKey{}, nil) ak, err := c.Register(mockPortal) Expect(err).To(BeNil()) From 1f2be9e7d79dca8b43f20d341194cdc5747dbfc3 Mon Sep 17 00:00:00 2001 From: siherrmann <25087590+siherrmann@users.noreply.github.com> Date: Fri, 19 Dec 2025 09:08:08 +0000 Subject: [PATCH 4/4] chore(docs): Auto-update docs and licenses Signed-off-by: siherrmann <25087590+siherrmann@users.noreply.github.com> --- internal/tmpl/NOTICE | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index d7e513d..1940199 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -23,9 +23,9 @@ License URL: https://github.com/clipperhouse/uax29/blob/v2.3.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go/pkg/io -Version: v0.14.1 +Version: v0.15.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v0.14.1/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v0.15.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl @@ -77,9 +77,9 @@ License URL: https://github.com/inconshreveable/go-update/blob/8152e7eb6ccf/inte ---------- Module: github.com/jedib0t/go-pretty/v6 -Version: v6.7.5 +Version: v6.7.7 License: MIT -License URL: https://github.com/jedib0t/go-pretty/blob/v6.7.5/LICENSE +License URL: https://github.com/jedib0t/go-pretty/blob/v6.7.7/LICENSE ---------- Module: github.com/mattn/go-runewidth @@ -155,9 +155,9 @@ License URL: https://github.com/yaml/go-yaml/blob/v3.0.4/LICENSE ---------- Module: golang.org/x/crypto -Version: v0.45.0 +Version: v0.46.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/crypto/+/v0.45.0:LICENSE +License URL: https://cs.opensource.google/go/x/crypto/+/v0.46.0:LICENSE ---------- Module: golang.org/x/oauth2 @@ -167,9 +167,9 @@ License URL: https://cs.opensource.google/go/x/oauth2/+/v0.33.0:LICENSE ---------- Module: golang.org/x/text -Version: v0.31.0 +Version: v0.32.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/text/+/v0.31.0:LICENSE +License URL: https://cs.opensource.google/go/x/text/+/v0.32.0:LICENSE ---------- Module: gopkg.in/yaml.v3