test(config,git,logger): add some test functions
This commit is contained in:
parent
066f8d764e
commit
0c7af69087
16 changed files with 387 additions and 25 deletions
|
@ -1,7 +1,16 @@
|
||||||
|
# This code is licensed under the terms of the MIT license https://opensource.org/license/mit
|
||||||
|
# Copyright (c) 2024 Marat Reymers
|
||||||
|
|
||||||
|
## Golden config for golangci-lint v1.62.0
|
||||||
|
#
|
||||||
|
# This is the best config for golangci-lint based on my experience and opinion.
|
||||||
|
# It is very strict, but not extremely strict.
|
||||||
|
# Feel free to adapt and change it for your needs.
|
||||||
|
|
||||||
run:
|
run:
|
||||||
# Timeout for analysis, e.g. 30s, 5m.
|
# Timeout for analysis, e.g. 30s, 5m.
|
||||||
# Default: 1m
|
# Default: 1m
|
||||||
timeout: 5m
|
timeout: 3m
|
||||||
|
|
||||||
|
|
||||||
# This file contains only configs which differ from defaults.
|
# This file contains only configs which differ from defaults.
|
||||||
|
@ -71,6 +80,11 @@ linters-settings:
|
||||||
# Default false
|
# Default false
|
||||||
ignore-comments: true
|
ignore-comments: true
|
||||||
|
|
||||||
|
gochecksumtype:
|
||||||
|
# Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.
|
||||||
|
# Default: true
|
||||||
|
default-signifies-exhaustive: false
|
||||||
|
|
||||||
gocognit:
|
gocognit:
|
||||||
# Minimal code complexity to report.
|
# Minimal code complexity to report.
|
||||||
# Default: 30 (but we recommend 10-20)
|
# Default: 30 (but we recommend 10-20)
|
||||||
|
@ -218,14 +232,13 @@ linters:
|
||||||
- bidichk # checks for dangerous unicode character sequences
|
- bidichk # checks for dangerous unicode character sequences
|
||||||
- bodyclose # checks whether HTTP response body is closed successfully
|
- bodyclose # checks whether HTTP response body is closed successfully
|
||||||
- canonicalheader # checks whether net/http.Header uses canonical header
|
- canonicalheader # checks whether net/http.Header uses canonical header
|
||||||
- copyloopvar # detects places where loop variables are copied
|
- copyloopvar # detects places where loop variables are copied (Go 1.22+)
|
||||||
- cyclop # checks function and package cyclomatic complexity
|
- cyclop # checks function and package cyclomatic complexity
|
||||||
- dupl # tool for code clone detection
|
- dupl # tool for code clone detection
|
||||||
- durationcheck # checks for two durations multiplied together
|
- durationcheck # checks for two durations multiplied together
|
||||||
- errname # checks that sentinel errors are prefixed with the Err and error types are suffixed with the Error
|
- errname # checks that sentinel errors are prefixed with the Err and error types are suffixed with the Error
|
||||||
- errorlint # finds code that will cause problems with the error wrapping scheme introduced in Go 1.13
|
- errorlint # finds code that will cause problems with the error wrapping scheme introduced in Go 1.13
|
||||||
- exhaustive # checks exhaustiveness of enum switch statements
|
- exhaustive # checks exhaustiveness of enum switch statements
|
||||||
- exportloopref # checks for pointers to enclosing loop variables
|
|
||||||
- fatcontext # detects nested contexts in loops
|
- fatcontext # detects nested contexts in loops
|
||||||
- forbidigo # forbids identifiers
|
- forbidigo # forbids identifiers
|
||||||
- funlen # tool for detection of long functions
|
- funlen # tool for detection of long functions
|
||||||
|
@ -243,6 +256,7 @@ linters:
|
||||||
- gomodguard # allow and block lists linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations
|
- gomodguard # allow and block lists linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations
|
||||||
- goprintffuncname # checks that printf-like functions are named with f at the end
|
- goprintffuncname # checks that printf-like functions are named with f at the end
|
||||||
- gosec # inspects source code for security problems
|
- gosec # inspects source code for security problems
|
||||||
|
- iface # checks the incorrect use of interfaces, helping developers avoid interface pollution
|
||||||
- intrange # finds places where for loops could make use of an integer range
|
- intrange # finds places where for loops could make use of an integer range
|
||||||
- lll # reports long lines
|
- lll # reports long lines
|
||||||
- loggercheck # checks key value pairs for common logger libraries (kitlog,klog,logr,zap)
|
- loggercheck # checks key value pairs for common logger libraries (kitlog,klog,logr,zap)
|
||||||
|
@ -264,6 +278,7 @@ linters:
|
||||||
- promlinter # checks Prometheus metrics naming via promlint
|
- promlinter # checks Prometheus metrics naming via promlint
|
||||||
- protogetter # reports direct reads from proto message fields when getters should be used
|
- protogetter # reports direct reads from proto message fields when getters should be used
|
||||||
- reassign # checks that package variables are not reassigned
|
- reassign # checks that package variables are not reassigned
|
||||||
|
- recvcheck # checks for receiver type consistency
|
||||||
- revive # fast, configurable, extensible, flexible, and beautiful linter for Go, drop-in replacement of golint
|
- revive # fast, configurable, extensible, flexible, and beautiful linter for Go, drop-in replacement of golint
|
||||||
- rowserrcheck # checks whether Err of rows is checked successfully
|
- rowserrcheck # checks whether Err of rows is checked successfully
|
||||||
- sloglint # ensure consistent code style when using log/slog
|
- sloglint # ensure consistent code style when using log/slog
|
||||||
|
@ -305,7 +320,7 @@ linters:
|
||||||
#- dupword # [useless without config] checks for duplicate words in the source code
|
#- dupword # [useless without config] checks for duplicate words in the source code
|
||||||
#- err113 # [too strict] checks the errors handling expressions
|
#- err113 # [too strict] checks the errors handling expressions
|
||||||
#- errchkjson # [don't see profit + I'm against of omitting errors like in the first example https://github.com/breml/errchkjson] checks types passed to the json encoding functions. Reports unsupported types and optionally reports occasions, where the check for the returned error can be omitted
|
#- errchkjson # [don't see profit + I'm against of omitting errors like in the first example https://github.com/breml/errchkjson] checks types passed to the json encoding functions. Reports unsupported types and optionally reports occasions, where the check for the returned error can be omitted
|
||||||
#- execinquery # [deprecated] checks query string in Query function which reads your Go src files and warning it finds
|
#- exportloopref # [not necessary from Go 1.22] checks for pointers to enclosing loop variables
|
||||||
#- forcetypeassert # [replaced by errcheck] finds forced type assertions
|
#- forcetypeassert # [replaced by errcheck] finds forced type assertions
|
||||||
#- gofmt # [replaced by goimports] checks whether code was gofmt-ed
|
#- gofmt # [replaced by goimports] checks whether code was gofmt-ed
|
||||||
#- gofumpt # [replaced by goimports, gofumports is not available yet] checks whether code was gofumpt-ed
|
#- gofumpt # [replaced by goimports, gofumports is not available yet] checks whether code was gofumpt-ed
|
||||||
|
@ -335,6 +350,7 @@ issues:
|
||||||
linters:
|
linters:
|
||||||
- bodyclose
|
- bodyclose
|
||||||
- dupl
|
- dupl
|
||||||
|
- errcheck
|
||||||
- funlen
|
- funlen
|
||||||
- goconst
|
- goconst
|
||||||
- gosec
|
- gosec
|
||||||
|
|
|
@ -38,6 +38,5 @@ steps:
|
||||||
exclude: main
|
exclude: main
|
||||||
event: push
|
event: push
|
||||||
depends_on:
|
depends_on:
|
||||||
- gofmt
|
|
||||||
- lint
|
- lint
|
||||||
- vulncheck
|
- test
|
||||||
|
|
|
@ -24,4 +24,6 @@ steps:
|
||||||
- branch: main
|
- branch: main
|
||||||
event: push
|
event: push
|
||||||
depends_on:
|
depends_on:
|
||||||
- build
|
- build
|
||||||
|
- lint
|
||||||
|
- test
|
||||||
|
|
|
@ -1,4 +1,17 @@
|
||||||
steps:
|
steps:
|
||||||
|
- name: gofmt
|
||||||
|
image: golang:1.22.5
|
||||||
|
commands:
|
||||||
|
- gofmt -l -s .
|
||||||
|
when:
|
||||||
|
- event: push
|
||||||
|
- name: vuln-check
|
||||||
|
image: golang:1.22.5
|
||||||
|
commands:
|
||||||
|
- go install golang.org/x/vuln/cmd/govulncheck@latest
|
||||||
|
- govulncheck ./...
|
||||||
|
when:
|
||||||
|
- event: push
|
||||||
- name: golangci-linter
|
- name: golangci-linter
|
||||||
image: golangci/golangci-lint:v1.59.1
|
image: golangci/golangci-lint:v1.59.1
|
||||||
commands:
|
commands:
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
steps:
|
steps:
|
||||||
- name: gofmt
|
- name: gotest
|
||||||
image: golang:1.22.5
|
image: golang:1.22.5
|
||||||
commands:
|
commands:
|
||||||
- gofmt -l -s .
|
- go test ./...
|
||||||
when:
|
when:
|
||||||
- event: push
|
- event: push
|
||||||
|
depends_on:
|
||||||
|
- lint
|
|
@ -1,8 +0,0 @@
|
||||||
steps:
|
|
||||||
- name: vuln-check
|
|
||||||
image: golang:1.22.5
|
|
||||||
commands:
|
|
||||||
- go install golang.org/x/vuln/cmd/govulncheck@latest
|
|
||||||
- govulncheck ./...
|
|
||||||
when:
|
|
||||||
- event: push
|
|
3
go.mod
3
go.mod
|
@ -10,6 +10,7 @@ require (
|
||||||
github.com/spf13/cobra v1.8.1
|
github.com/spf13/cobra v1.8.1
|
||||||
github.com/spf13/pflag v1.0.5
|
github.com/spf13/pflag v1.0.5
|
||||||
github.com/spf13/viper v1.19.0
|
github.com/spf13/viper v1.19.0
|
||||||
|
github.com/stretchr/testify v1.9.0
|
||||||
golang.org/x/net v0.28.0
|
golang.org/x/net v0.28.0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -18,6 +19,7 @@ require (
|
||||||
github.com/Microsoft/go-winio v0.6.2 // indirect
|
github.com/Microsoft/go-winio v0.6.2 // indirect
|
||||||
github.com/cloudflare/circl v1.3.9 // indirect
|
github.com/cloudflare/circl v1.3.9 // indirect
|
||||||
github.com/cyphar/filepath-securejoin v0.3.1 // indirect
|
github.com/cyphar/filepath-securejoin v0.3.1 // indirect
|
||||||
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
github.com/emirpasic/gods v1.18.1 // indirect
|
github.com/emirpasic/gods v1.18.1 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
||||||
|
@ -32,6 +34,7 @@ require (
|
||||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
|
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
|
||||||
github.com/pjbgf/sha1cd v0.3.0 // indirect
|
github.com/pjbgf/sha1cd v0.3.0 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/sagikazarmark/locafero v0.6.0 // indirect
|
github.com/sagikazarmark/locafero v0.6.0 // indirect
|
||||||
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
||||||
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
|
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
|
||||||
|
|
|
@ -7,6 +7,15 @@ import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrInvalidGrafanaURL = errors.New("invalid grafana URL, must not be blank")
|
||||||
|
ErrInvalidAuthToken = errors.New("invalid auth token for grafana, must not be blank")
|
||||||
|
ErrInvalidRepoURL = errors.New("invalid repo url for git, must not be blank")
|
||||||
|
ErrInvalidGitUser = errors.New("invalid username for git, must not be blank")
|
||||||
|
ErrInvalidGitPass = errors.New("invalid password for git, must not be blank")
|
||||||
|
ErrInvalidBranchName = errors.New("invalid branch name for git, must not be blank")
|
||||||
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Debug bool
|
Debug bool
|
||||||
ForceCommits bool
|
ForceCommits bool
|
||||||
|
@ -29,27 +38,27 @@ func (c *Config) Validate() []error {
|
||||||
var errs []error
|
var errs []error
|
||||||
|
|
||||||
if c.GrafanaURL == "" {
|
if c.GrafanaURL == "" {
|
||||||
errs = append(errs, errors.New("invalid grafana URL, must not be blank"))
|
errs = append(errs, ErrInvalidGrafanaURL)
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.GrafanaToken == "" {
|
if c.GrafanaToken == "" {
|
||||||
errs = append(errs, errors.New("invalid auth token for grafana, must not be blank"))
|
errs = append(errs, ErrInvalidAuthToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.GitRepo == "" {
|
if c.GitRepo == "" {
|
||||||
errs = append(errs, errors.New("invalid repo url for git, must not be blank"))
|
errs = append(errs, ErrInvalidRepoURL)
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.GitUser == "" {
|
if c.GitUser == "" {
|
||||||
errs = append(errs, errors.New("invalid username for git, must not be blank"))
|
errs = append(errs, ErrInvalidGitUser)
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.GitPass == "" {
|
if c.GitPass == "" {
|
||||||
errs = append(errs, errors.New("invalid password for git, must not be blank"))
|
errs = append(errs, ErrInvalidGitPass)
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.GitBranch == "" {
|
if c.GitBranch == "" {
|
||||||
errs = append(errs, errors.New("invalid branch name for git, must not be blank"))
|
errs = append(errs, ErrInvalidBranchName)
|
||||||
}
|
}
|
||||||
|
|
||||||
return errs
|
return errs
|
||||||
|
|
40
internal/config/config_test.go
Normal file
40
internal/config/config_test.go
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
package config_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.ar21.de/yolokube/grafana-backuper/internal/config"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestConfig_Validate_MissingFields(t *testing.T) {
|
||||||
|
cfg := config.Config{}
|
||||||
|
|
||||||
|
errs := cfg.Validate()
|
||||||
|
assert.Len(t, errs, 6) // Expecting 6 errors since all required fields are missing
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestConfig_Validate_AllFieldsPresent(t *testing.T) {
|
||||||
|
cfg := config.Config{
|
||||||
|
GrafanaURL: "http://grafana.example.com",
|
||||||
|
GrafanaToken: "sometoken",
|
||||||
|
GitRepo: "https://github.com/user/repo",
|
||||||
|
GitUser: "username",
|
||||||
|
GitPass: "password",
|
||||||
|
GitBranch: "main",
|
||||||
|
}
|
||||||
|
|
||||||
|
errs := cfg.Validate()
|
||||||
|
assert.Empty(t, errs) // No errors should be returned when all fields are valid
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestConfig_Validate_PartiallyPopulated(t *testing.T) {
|
||||||
|
cfg := config.Config{
|
||||||
|
GrafanaURL: "http://grafana.example.com",
|
||||||
|
GitRepo: "https://github.com/user/repo",
|
||||||
|
GitUser: "username",
|
||||||
|
}
|
||||||
|
|
||||||
|
errs := cfg.Validate()
|
||||||
|
assert.Len(t, errs, 3) // Expecting 3 errors for missing GrafanaToken, GitPass, and GitBranch
|
||||||
|
}
|
49
internal/logger/logger_test.go
Normal file
49
internal/logger/logger_test.go
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
package logger_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.ar21.de/yolokube/grafana-backuper/internal/logger"
|
||||||
|
"github.com/rs/zerolog"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCliLoggerLayout_DebugLevel(t *testing.T) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
zerolog.SetGlobalLevel(zerolog.DebugLevel)
|
||||||
|
|
||||||
|
log := logger.CliLoggerLayout(&buf)
|
||||||
|
log.Debug().Msg("test message")
|
||||||
|
|
||||||
|
output := buf.String()
|
||||||
|
assert.Contains(t, output, "test message")
|
||||||
|
assert.Contains(t, output, "DBG") // Assuming zerolog adds a short level indicator like "DBG"
|
||||||
|
assert.Contains(t, output, ".go:") // Ensures the caller file and line are included
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCliLoggerLayout_NonDebugLevel(t *testing.T) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
zerolog.SetGlobalLevel(zerolog.InfoLevel)
|
||||||
|
|
||||||
|
log := logger.CliLoggerLayout(&buf)
|
||||||
|
log.Info().Msg("test message")
|
||||||
|
|
||||||
|
output := buf.String()
|
||||||
|
assert.Contains(t, output, "test message")
|
||||||
|
assert.NotContains(t, output, "DBG") // Since we're at Info level
|
||||||
|
assert.NotContains(t, output, ".go:") // Caller information should not be included
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestJSONLoggerLayout(t *testing.T) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
|
||||||
|
log := logger.JSONLoggerLayout(&buf)
|
||||||
|
log.Info().Msg("test message")
|
||||||
|
|
||||||
|
output := buf.String()
|
||||||
|
assert.Contains(t, output, `"message":"test message"`)
|
||||||
|
assert.Contains(t, output, `"level":"info"`)
|
||||||
|
assert.Contains(t, output, `"time":`) // Timestamp should be included
|
||||||
|
assert.Contains(t, output, `"caller":`) // Caller should be included
|
||||||
|
}
|
14
pkg/git/project_test.go
Normal file
14
pkg/git/project_test.go
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
package git_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.ar21.de/yolokube/grafana-backuper/pkg/git"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNewProject(t *testing.T) {
|
||||||
|
project := git.NewProject("https://example.com/repo.git")
|
||||||
|
assert.NotNil(t, project)
|
||||||
|
assert.Equal(t, "https://example.com/repo.git", project.RepoURL)
|
||||||
|
}
|
36
pkg/git/sign_key_test.go
Normal file
36
pkg/git/sign_key_test.go
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
package git_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.ar21.de/yolokube/grafana-backuper/pkg/git"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestReadKeyFile_Success(t *testing.T) {
|
||||||
|
signKey := &git.SignKey{KeyFile: "testdata/test-key.asc"}
|
||||||
|
err := signKey.ReadKeyFile()
|
||||||
|
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadKeyFile_FileError(t *testing.T) {
|
||||||
|
signKey := &git.SignKey{KeyFile: "nonexistent-file.asc"}
|
||||||
|
err := signKey.ReadKeyFile()
|
||||||
|
|
||||||
|
assert.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadKeyFile_DecodingError(t *testing.T) {
|
||||||
|
signKey := &git.SignKey{KeyFile: "testdata/test-invalid-key.asc"}
|
||||||
|
err := signKey.ReadKeyFile()
|
||||||
|
|
||||||
|
assert.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadKeyFile_EmptyKeyRing(t *testing.T) {
|
||||||
|
signKey := &git.SignKey{KeyFile: "testdata/test-empty-key.asc"}
|
||||||
|
err := signKey.ReadKeyFile()
|
||||||
|
|
||||||
|
assert.Error(t, err)
|
||||||
|
}
|
4
pkg/git/testdata/test-empty-key.asc
vendored
Normal file
4
pkg/git/testdata/test-empty-key.asc
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
-----BEGIN PGP PRIVATE KEY BLOCK-----
|
||||||
|
Version: Keybase OpenPGP v1.0.0
|
||||||
|
Comment: https://keybase.io/crypto
|
||||||
|
-----END PGP PRIVATE KEY BLOCK-----
|
1
pkg/git/testdata/test-invalid-key.asc
vendored
Normal file
1
pkg/git/testdata/test-invalid-key.asc
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
invalid content
|
182
pkg/git/testdata/test-key.asc
vendored
Normal file
182
pkg/git/testdata/test-key.asc
vendored
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
-----BEGIN PGP PRIVATE KEY BLOCK-----
|
||||||
|
Version: Keybase OpenPGP v1.0.0
|
||||||
|
Comment: https://keybase.io/crypto
|
||||||
|
|
||||||
|
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
|
||||||
|
YZ3g9Y8QOzszYPB450rVxLOEY6eV1Q==
|
||||||
|
=W3yz
|
||||||
|
-----END PGP PRIVATE KEY BLOCK-----
|
|
@ -74,7 +74,7 @@ func (c *DashboardVersionClient) Get(
|
||||||
version uint,
|
version uint,
|
||||||
params ...DashboardVersionParam,
|
params ...DashboardVersionParam,
|
||||||
) (*DashboardVersion, *Response, error) {
|
) (*DashboardVersion, *Response, error) {
|
||||||
if id, err := strconv.Atoi(input); err == nil {
|
if id, err := strconv.ParseUint(input, 10, 64); err == nil {
|
||||||
return c.GetByID(ctx, uint(id), version, params...)
|
return c.GetByID(ctx, uint(id), version, params...)
|
||||||
}
|
}
|
||||||
return c.GetByUID(ctx, input, version, params...)
|
return c.GetByUID(ctx, input, version, params...)
|
||||||
|
@ -111,7 +111,7 @@ func (c *DashboardVersionClient) List(
|
||||||
input string,
|
input string,
|
||||||
params ...DashboardVersionParam,
|
params ...DashboardVersionParam,
|
||||||
) ([]*DashboardVersion, *Response, error) {
|
) ([]*DashboardVersion, *Response, error) {
|
||||||
if id, err := strconv.Atoi(input); err == nil {
|
if id, err := strconv.ParseUint(input, 10, 64); err == nil {
|
||||||
return c.ListByID(ctx, uint(id), params...)
|
return c.ListByID(ctx, uint(id), params...)
|
||||||
}
|
}
|
||||||
return c.ListByUID(ctx, input, params...)
|
return c.ListByUID(ctx, input, params...)
|
||||||
|
|
Loading…
Reference in a new issue