Skip to content

Commit 6f99e54

Browse files
authored
test: replace httpmock (#89)
1 parent 5e753b3 commit 6f99e54

File tree

16 files changed

+265
-158
lines changed

16 files changed

+265
-158
lines changed

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ orbs:
66
go_image: &go_image
77
resource_class: small
88
docker:
9-
- image: cimg/go:1.21
9+
- image: cimg/go:1.23
1010

1111
jobs:
1212
security-scans:

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
- name: Set up Go
1515
uses: actions/setup-go@v3
1616
with:
17-
go-version: 1.20.3
17+
go-version: 1.23.2
1818

1919
- name: Lint
2020
uses: golangci/golangci-lint-action@v3

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/snyk/parlay
22

3-
go 1.20
3+
go 1.23
44

55
require (
66
github.com/CycloneDX/cyclonedx-go v0.9.0

go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHS
4949
github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
5050
github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
5151
github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M=
52+
github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0=
5253
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
5354
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
5455
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
@@ -73,6 +74,7 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y
7374
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
7475
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
7576
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
77+
github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
7678
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
7779
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
7880
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@@ -155,9 +157,11 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
155157
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
156158
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
157159
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
160+
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
158161
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
159162
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
160163
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
164+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
161165
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
162166
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
163167
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
@@ -167,6 +171,7 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k
167171
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
168172
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
169173
github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g=
174+
github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM=
170175
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
171176
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
172177
github.com/package-url/packageurl-go v0.1.2 h1:0H2DQt6DHd/NeRlVwW4EZ4oEI6Bn40XlNPRqegcxuo4=
@@ -182,6 +187,7 @@ github.com/remeh/sizedwaitgroup v1.0.0 h1:VNGGFwNo/R5+MJBf6yrsr110p0m4/OX4S3DCy7
182187
github.com/remeh/sizedwaitgroup v1.0.0/go.mod h1:3j2R4OIe/SeS6YDhICBy22RWjJC5eNCJ1V+9+NVNYlo=
183188
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
184189
github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
190+
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
185191
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
186192
github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc=
187193
github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU=
@@ -220,9 +226,13 @@ github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8
220226
github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
221227
github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
222228
github.com/terminalstatic/go-xsd-validate v0.1.5 h1:RqpJnf6HGE2CB/lZB1A8BYguk8uRtcvYAPLCF15qguo=
229+
github.com/terminalstatic/go-xsd-validate v0.1.5/go.mod h1:18lsvYFofBflqCrvo1umpABZ99+GneNTw2kEEc8UPJw=
223230
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
231+
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
224232
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
233+
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
225234
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
235+
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
226236
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
227237
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
228238
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=

internal/commands/snyk/config.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package snyk
2+
3+
import (
4+
"os"
5+
6+
"github.com/snyk/parlay/lib/snyk"
7+
)
8+
9+
func config() *snyk.Config {
10+
c := snyk.DefaultConfig()
11+
12+
if t := os.Getenv("SNYK_TOKEN"); t != "" {
13+
c.APIToken = t
14+
}
15+
if u := os.Getenv("SNYK_API"); u != "" {
16+
c.SnykAPIURL = u
17+
}
18+
19+
return c
20+
}

internal/commands/snyk/enrich.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ func NewEnrichCommand(logger *zerolog.Logger) *cobra.Command {
1717
Short: "Enrich an SBOM with Snyk data",
1818
Args: cobra.ExactArgs(1),
1919
Run: func(cmd *cobra.Command, args []string) {
20+
cfg := config()
21+
svc := snyk.NewService(cfg, logger)
22+
2023
b, err := utils.GetUserInput(args[0], os.Stdin)
2124
if err != nil {
2225
logger.Fatal().Err(err).Msg("Failed to read input")
@@ -27,7 +30,7 @@ func NewEnrichCommand(logger *zerolog.Logger) *cobra.Command {
2730
logger.Fatal().Err(err).Msg("Failed to read SBOM input")
2831
}
2932

30-
snyk.EnrichSBOM(doc, logger)
33+
svc.EnrichSBOM(doc)
3134

3235
if err := doc.Encode(os.Stdout); err != nil {
3336
logger.Fatal().Err(err).Msg("Failed to encode new SBOM")

internal/commands/snyk/packages.go

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ func NewPackageCommand(logger *zerolog.Logger) *cobra.Command {
1616
Short: "Return package vulnerabilities from Snyk",
1717
Args: cobra.ExactArgs(1),
1818
Run: func(cmd *cobra.Command, args []string) {
19+
cfg := config()
20+
svc := snyk.NewService(cfg, logger)
21+
1922
purl, err := packageurl.FromString(args[0])
2023
if err != nil {
2124
logger.Fatal().Err(err).Msg("Failed to parse PackageURL")
@@ -26,23 +29,7 @@ func NewPackageCommand(logger *zerolog.Logger) *cobra.Command {
2629
Str("purl", args[0]).
2730
Msg("Looking up package vulnerabilities from Snyk")
2831

29-
auth, err := snyk.AuthFromToken(snyk.APIToken())
30-
if err != nil {
31-
logger.
32-
Fatal().
33-
Err(err).
34-
Msg("Failed to get API credentials")
35-
}
36-
37-
orgID, err := snyk.SnykOrgID(auth)
38-
if err != nil {
39-
logger.
40-
Fatal().
41-
Err(err).
42-
Msg("Failed to look up user info")
43-
}
44-
45-
resp, err := snyk.GetPackageVulnerabilities(&purl, auth, orgID)
32+
resp, err := svc.GetPackageVulnerabilities(&purl)
4633
if err != nil {
4734
logger.Fatal().Err(err).Msg("Failed to look up package vulnerabilities")
4835
}

lib/snyk/config.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* © 2024 Snyk Limited All rights reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package snyk
18+
19+
type Config struct {
20+
SnykAPIURL string
21+
APIToken string
22+
}
23+
24+
func DefaultConfig() *Config {
25+
return &Config{
26+
SnykAPIURL: "https://api.snyk.io",
27+
}
28+
}

lib/snyk/enrich.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,17 @@ import (
2424
"github.com/snyk/parlay/lib/sbom"
2525
)
2626

27-
func EnrichSBOM(doc *sbom.SBOMDocument, logger *zerolog.Logger) *sbom.SBOMDocument {
27+
const (
28+
snykAdvisorWebURL = "https://snyk.io/advisor"
29+
snykVulnerabilityDBWebURL = "https://security.snyk.io"
30+
)
31+
32+
func EnrichSBOM(cfg *Config, doc *sbom.SBOMDocument, logger *zerolog.Logger) *sbom.SBOMDocument {
2833
switch bom := doc.BOM.(type) {
2934
case *cdx.BOM:
30-
enrichCycloneDX(bom, logger)
35+
enrichCycloneDX(cfg, bom, logger)
3136
case *spdx.Document:
32-
enrichSPDX(bom, logger)
37+
enrichSPDX(cfg, bom, logger)
3338
}
3439

3540
return doc

lib/snyk/enrich_cyclonedx.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@ import (
3131
"github.com/snyk/parlay/snyk/issues"
3232
)
3333

34-
type cdxEnricher = func(*cdx.Component, *packageurl.PackageURL)
34+
type cdxEnricher = func(*Config, *cdx.Component, *packageurl.PackageURL)
3535

3636
var cdxEnrichers = []cdxEnricher{
3737
enrichCDXSnykAdvisorData,
3838
enrichCDXSnykVulnerabilityDBData,
3939
}
4040

41-
func enrichCDXSnykVulnerabilityDBData(component *cdx.Component, purl *packageurl.PackageURL) {
42-
url := SnykVulnURL(purl)
41+
func enrichCDXSnykVulnerabilityDBData(cfg *Config, component *cdx.Component, purl *packageurl.PackageURL) {
42+
url := SnykVulnURL(cfg, purl)
4343
if url != "" {
4444
ext := cdx.ExternalReference{
4545
URL: url,
@@ -54,8 +54,8 @@ func enrichCDXSnykVulnerabilityDBData(component *cdx.Component, purl *packageurl
5454
}
5555
}
5656

57-
func enrichCDXSnykAdvisorData(component *cdx.Component, purl *packageurl.PackageURL) {
58-
url := SnykAdvisorURL(purl)
57+
func enrichCDXSnykAdvisorData(cfg *Config, component *cdx.Component, purl *packageurl.PackageURL) {
58+
url := SnykAdvisorURL(cfg, purl)
5959
if url != "" {
6060
ext := cdx.ExternalReference{
6161
URL: url,
@@ -70,14 +70,14 @@ func enrichCDXSnykAdvisorData(component *cdx.Component, purl *packageurl.Package
7070
}
7171
}
7272

73-
func enrichCycloneDX(bom *cdx.BOM, logger *zerolog.Logger) *cdx.BOM {
74-
auth, err := AuthFromToken(APIToken())
73+
func enrichCycloneDX(cfg *Config, bom *cdx.BOM, logger *zerolog.Logger) *cdx.BOM {
74+
auth, err := AuthFromToken(cfg.APIToken)
7575
if err != nil {
7676
logger.Fatal().Err(err).Msg("Failed to authenticate")
7777
return nil
7878
}
7979

80-
orgID, err := SnykOrgID(auth)
80+
orgID, err := SnykOrgID(cfg, auth)
8181
if err != nil {
8282
logger.Error().Err(err).Msg("Failed to infer preferred Snyk organization")
8383
return nil
@@ -105,9 +105,9 @@ func enrichCycloneDX(bom *cdx.BOM, logger *zerolog.Logger) *cdx.BOM {
105105
return
106106
}
107107
for _, enrichFunc := range cdxEnrichers {
108-
enrichFunc(component, &purl)
108+
enrichFunc(cfg, component, &purl)
109109
}
110-
resp, err := GetPackageVulnerabilities(&purl, auth, orgID)
110+
resp, err := GetPackageVulnerabilities(cfg, &purl, auth, orgID)
111111
if err != nil {
112112
l.Err(err).
113113
Str("purl", purl.ToString()).
@@ -206,7 +206,7 @@ func enrichCycloneDX(bom *cdx.BOM, logger *zerolog.Logger) *cdx.BOM {
206206
for _, sev := range *issue.Attributes.Severities {
207207
source := cdx.Source{
208208
Name: "Snyk",
209-
URL: "https://security.snyk.io",
209+
URL: snykVulnerabilityDBWebURL,
210210
}
211211
if sev.Score != nil {
212212
score := float64(*sev.Score)

0 commit comments

Comments
 (0)