Skip to content

Commit b499a46

Browse files
authored
Test/cmd initial (#18)
* test: expired cert case for certinfo * test: cmd files * ci: move to go 1.25 * test: add test coverage settings * ci: remove tests for go 1.24 * ci: add test coverage check
1 parent 12f0244 commit b499a46

17 files changed

Lines changed: 547 additions & 45 deletions

.github/workflows/codeChecks.yml

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ on:
55
paths:
66
- ".github/workflows/codeChecks.yml"
77
- ".goreleaser.yaml"
8+
- ".testcoverage.yml"
89
- "devenv.*"
910
- "cmd/**"
1011
- "internal/**"
@@ -13,13 +14,12 @@ on:
1314
- "go.*"
1415

1516
jobs:
16-
1717
go_tests:
1818
runs-on: ubuntu-latest
1919
strategy:
2020
max-parallel: 1
2121
matrix:
22-
go-version: ['1.24', '1.25']
22+
go-version: ["1.25"]
2323

2424
steps:
2525
- name: Checkout
@@ -69,6 +69,23 @@ jobs:
6969
run: devenv test
7070
timeout-minutes: 15
7171

72+
go_test_coverage_check:
73+
needs: go_tests
74+
runs-on: ubuntu-latest
75+
steps:
76+
- uses: actions/checkout@v5
77+
- uses: actions/setup-go@v6
78+
with:
79+
go-version: "1.25"
80+
81+
- name: generate test coverage
82+
run: go test ./... -coverprofile=./cover.out -covermode=atomic -coverpkg=./...
83+
84+
- name: check test coverage
85+
uses: vladopajic/go-test-coverage@v2
86+
with:
87+
config: ./.testcoverage.yml
88+
7289
goreleaser_test:
7390
needs: devenv_test
7491
runs-on: ubuntu-latest
@@ -85,7 +102,7 @@ jobs:
85102
- name: Set up Go
86103
uses: actions/setup-go@v6
87104
with:
88-
go-version: '1.25'
105+
go-version: "1.25"
89106

90107
- name: Run GoReleaser test
91108
uses: goreleaser/goreleaser-action@v6

.testcoverage.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
profile: cover.out
2+
3+
threshold:
4+
file: 70
5+
package: 80
6+
total: 80
7+
8+
exclude:
9+
paths:
10+
- internal/style/style_handlers.go
11+
- main\.go$
12+
- cmd/main\.go$

cmd/certinfo_test.go

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package cmd
2+
3+
import (
4+
"bytes"
5+
_ "embed"
6+
"testing"
7+
8+
_ "github.com/breml/rootcerts"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestCertinfoCmd(t *testing.T) {
13+
tests := []struct {
14+
name string
15+
args []string
16+
expectError bool
17+
errMsgs []string
18+
expected []string
19+
}{
20+
{
21+
name: "no args",
22+
args: []string{"certinfo"},
23+
expectError: false,
24+
expected: []string{
25+
"https-wrench certinfo",
26+
"Usage:",
27+
"Flags:",
28+
"Global Flags:",
29+
"--key-file",
30+
"--tls-endpoint",
31+
"--tls-insecure",
32+
"--tls-servername",
33+
"--ca-bundle",
34+
"--version",
35+
"--help",
36+
},
37+
},
38+
{
39+
name: "key-file flag no value",
40+
args: []string{"certinfo", "--key-file"},
41+
expectError: true,
42+
errMsgs: []string{
43+
"flag needs an argument: --key-file",
44+
},
45+
expected: []string{
46+
"https-wrench certinfo [flags]",
47+
"--ca-bundle string",
48+
"--key-file string",
49+
"--tls-endpoint string",
50+
"--tls-insecure",
51+
"--tls-servername string",
52+
"Usage:",
53+
"--version Display the version",
54+
},
55+
},
56+
57+
{
58+
name: "tls-endpoint flag no value",
59+
args: []string{"certinfo", "--tls-endpoint"},
60+
expectError: true,
61+
errMsgs: []string{
62+
"flag needs an argument: --tls-endpoint",
63+
},
64+
expected: []string{
65+
"https-wrench certinfo [flags]",
66+
"--ca-bundle string",
67+
"--key-file string",
68+
"--tls-endpoint string",
69+
"--tls-insecure",
70+
"--tls-servername string",
71+
"Usage:",
72+
"--version Display the version",
73+
},
74+
},
75+
76+
{
77+
name: "tls-insecure incomplete params",
78+
args: []string{"certinfo", "--tls-insecure"},
79+
expectError: false,
80+
expected: []string{
81+
"https-wrench certinfo [flags]",
82+
"--ca-bundle string",
83+
"--key-file string",
84+
"--tls-endpoint string",
85+
"--tls-insecure",
86+
"--tls-servername string",
87+
"Usage:",
88+
"--version Display the version",
89+
},
90+
},
91+
}
92+
93+
for _, tc := range tests {
94+
tt := tc
95+
96+
t.Run(tt.name, func(t *testing.T) {
97+
reqOut := new(bytes.Buffer)
98+
reqCmd := rootCmd
99+
reqCmd.SetOut(reqOut)
100+
reqCmd.SetErr(reqOut)
101+
reqCmd.SetArgs(tt.args)
102+
err := reqCmd.Execute()
103+
104+
if tt.expectError {
105+
require.Error(t, err)
106+
107+
for _, expected := range tt.errMsgs {
108+
require.ErrorContains(t, err, expected)
109+
}
110+
111+
// return
112+
}
113+
114+
if !tt.expectError {
115+
require.NoError(t, err)
116+
}
117+
118+
got := reqOut.String()
119+
for _, expexted := range tt.expected {
120+
require.Contains(t, got, expexted)
121+
}
122+
})
123+
}
124+
}

cmd/config_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package cmd
2+
3+
import (
4+
_ "embed"
5+
"testing"
6+
7+
_ "github.com/breml/rootcerts"
8+
"github.com/google/go-cmp/cmp"
9+
"github.com/stretchr/testify/require"
10+
"github.com/xenos76/https-wrench/internal/requests"
11+
)
12+
13+
var emptyString = ""
14+
15+
func TestNewHTTPSWrenchConfig(t *testing.T) {
16+
t.Run("new HTTPSWrenchConfig", func(t *testing.T) {
17+
var mc requests.RequestsMetaConfig
18+
19+
config := NewHTTPSWrenchConfig()
20+
21+
require.False(t, config.Debug)
22+
require.False(t, config.Verbose)
23+
require.Equal(t, config.CaBundle, emptyString)
24+
25+
if diff := cmp.Diff(mc, config.RequestsMetaConfig); diff != "" {
26+
t.Errorf(
27+
"NewHTTPSWrenchConfig: RequestsMetaConfig mismatch (-want +got):\n%s",
28+
diff,
29+
)
30+
}
31+
})
32+
}

cmd/requests.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ Examples:
4545
versionRequested := viper.GetBool("version")
4646

4747
if versionRequested {
48-
fmt.Print(version)
48+
cmd.Print(version)
4949
return
5050
}
5151

5252
if showSampleConfig {
53-
fmt.Print(sampleYamlConfig)
53+
cmd.Print(sampleYamlConfig)
5454
return
5555
}
5656

cmd/requests_test.go

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package cmd
2+
3+
import (
4+
"bytes"
5+
_ "embed"
6+
"testing"
7+
8+
_ "github.com/breml/rootcerts"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestRequestsCmd(t *testing.T) {
13+
tests := []struct {
14+
name string
15+
args []string
16+
expectError bool
17+
errMsgs []string
18+
expected []string
19+
}{
20+
{
21+
name: "no args",
22+
args: []string{"requests"},
23+
expectError: false,
24+
expected: []string{
25+
"https-wrench requests",
26+
"Usage:",
27+
"Flags:",
28+
"Global Flags:",
29+
"--config",
30+
"--ca-bundle",
31+
"--show-sample-config",
32+
"--version",
33+
"--help",
34+
},
35+
},
36+
{
37+
name: "show sample config",
38+
args: []string{"requests", "--show-sample-config"},
39+
expectError: false,
40+
expected: []string{
41+
"https-wrench.schema.json",
42+
"requests:",
43+
"transportOverrideUrl:",
44+
"requestHeaders:",
45+
},
46+
},
47+
48+
{
49+
name: "ca-bundle flag no value",
50+
args: []string{"requests", "--ca-bundle"},
51+
expectError: true,
52+
errMsgs: []string{
53+
"flag needs an argument: --ca-bundle",
54+
},
55+
expected: []string{
56+
"https-wrench requests [flags]",
57+
"--ca-bundle string",
58+
"Usage:",
59+
"--version Display the version",
60+
},
61+
},
62+
63+
{
64+
name: "config flag no file",
65+
args: []string{"requests", "--config"},
66+
expectError: true,
67+
errMsgs: []string{
68+
"flag needs an argument: --config",
69+
},
70+
expected: []string{
71+
"https-wrench requests [flags]",
72+
"--ca-bundle string",
73+
"Usage:",
74+
"--version Display the version",
75+
},
76+
},
77+
78+
// WARN conflicts with same test for rootCmd
79+
// {
80+
// name: "config flag file not exist",
81+
// args: []string{
82+
// "requests",
83+
// "--config",
84+
// "/not-existent-file",
85+
// },
86+
// expectError: false,
87+
// expected: []string{
88+
// "Config file not found:",
89+
// "https-wrench requests [flags]",
90+
// "--ca-bundle string",
91+
// "Usage:",
92+
// "--version Display the version",
93+
// },
94+
// },
95+
//
96+
// WARN conflicts with same test for rootCmd
97+
// {
98+
// name: "version",
99+
// args: []string{"requests", "--version"},
100+
// expectError: false,
101+
// expected: []string{
102+
// "https-wrench requests [flags]",
103+
// "--ca-bundle string",
104+
// "Usage:",
105+
// "--version Display the version",
106+
// },
107+
// },
108+
}
109+
110+
for _, tc := range tests {
111+
tt := tc
112+
113+
t.Run(tt.name, func(t *testing.T) {
114+
reqOut := new(bytes.Buffer)
115+
reqCmd := rootCmd
116+
reqCmd.SetOut(reqOut)
117+
reqCmd.SetErr(reqOut)
118+
reqCmd.SetArgs(tt.args)
119+
err := reqCmd.Execute()
120+
121+
if tt.expectError {
122+
require.Error(t, err)
123+
124+
for _, expected := range tt.errMsgs {
125+
require.ErrorContains(t, err, expected)
126+
}
127+
128+
// return
129+
}
130+
131+
if !tt.expectError {
132+
require.NoError(t, err)
133+
}
134+
135+
got := reqOut.String()
136+
for _, expexted := range tt.expected {
137+
require.Contains(t, got, expexted)
138+
}
139+
})
140+
}
141+
}

cmd/root.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ https://github.com/xenOs76/https-wrench`,
6969
Run: func(cmd *cobra.Command, args []string) {
7070
showVersion, _ := cmd.Flags().GetBool("version")
7171
if showVersion {
72-
fmt.Println(version)
72+
cmd.Println(version)
7373

7474
return
7575
}

0 commit comments

Comments
 (0)