Skip to content

Commit 1995bc3

Browse files
🌱 Refactor to make it testable
- Related to #1568 Signed-off-by: naveensrinivasan <172697+naveensrinivasan@users.noreply.github.com>
1 parent f2a132a commit 1995bc3

File tree

7 files changed

+832
-32
lines changed

7 files changed

+832
-32
lines changed

Makefile

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ cron/data/metadata.pb.go: cron/data/metadata.proto | $(PROTOC)
110110
protoc --go_out=../../../ cron/data/metadata.proto
111111

112112
generate-mocks: ## Compiles and generates all mocks using mockgen.
113-
generate-mocks: clients/mockclients/repo_client.go clients/mockclients/repo.go clients/mockclients/cii_client.go checks/mockclients/vulnerabilities.go
113+
generate-mocks: clients/mockclients/repo_client.go clients/mockclients/repo.go clients/mockclients/cii_client.go checks/mockclients/vulnerabilities.go checks/mockclients/packagemanager.go
114114
clients/mockclients/repo_client.go: clients/repo_client.go
115115
# Generating MockRepoClient
116116
$(MOCKGEN) -source=clients/repo_client.go -destination=clients/mockclients/repo_client.go -package=mockrepo -copyright_file=clients/mockclients/license.txt
@@ -123,7 +123,9 @@ clients/mockclients/cii_client.go: clients/cii_client.go
123123
checks/mockclients/vulnerabilities.go: clients/vulnerabilities.go
124124
# Generating MockCIIClient
125125
$(MOCKGEN) -source=clients/vulnerabilities.go -destination=clients/mockclients/vulnerabilities.go -package=mockrepo -copyright_file=clients/mockclients/license.txt
126-
126+
checks/mockclients/packagemanager.go: cmd/packagemanager_client.go
127+
# Generating MockPackageManagerClient
128+
$(MOCKGEN) -source=cmd/packagemanager_client.go -destination=clients/mockclients/packagemanager.go -package=mockrepo -copyright_file=clients/mockclients/license.txt
127129
generate-docs: ## Generates docs
128130
generate-docs: validate-docs docs/checks.md
129131
docs/checks.md: docs/checks/internal/checks.yaml docs/checks/internal/*.go docs/checks/internal/generate/*.go

clients/mockclients/packagemanager.go

Lines changed: 65 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

clients/repo_client.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
// Package clients defines the interface for RepoClient and related structs.
1616
package clients
1717

18-
import "errors"
18+
import (
19+
"errors"
20+
)
1921

2022
// ErrUnsupportedFeature indicates an API that is not supported by the client.
2123
var ErrUnsupportedFeature = errors.New("unsupported feature")

cmd/package_managers.go

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ package cmd
1818
import (
1919
"encoding/json"
2020
"fmt"
21-
"net/http"
22-
"time"
2321

2422
sce "github.com/ossf/scorecard/v4/errors"
2523
)
@@ -29,24 +27,24 @@ type packageMangerResponse struct {
2927
exists bool
3028
}
3129

32-
// TODO(#1568): Add unit tests for this.
33-
func fetchGitRepositoryFromPackageManagers(npm, pypi, rubygems string) (packageMangerResponse, error) {
30+
func fetchGitRepositoryFromPackageManagers(npm, pypi, rubygems string,
31+
manager packageManagerClient) (packageMangerResponse, error) {
3432
if npm != "" {
35-
gitRepo, err := fetchGitRepositoryFromNPM(npm)
33+
gitRepo, err := fetchGitRepositoryFromNPM(npm, manager)
3634
return packageMangerResponse{
3735
exists: true,
3836
associatedRepo: gitRepo,
3937
}, err
4038
}
4139
if pypi != "" {
42-
gitRepo, err := fetchGitRepositoryFromPYPI(pypi)
40+
gitRepo, err := fetchGitRepositoryFromPYPI(pypi, manager)
4341
return packageMangerResponse{
4442
exists: true,
4543
associatedRepo: gitRepo,
4644
}, err
4745
}
4846
if rubygems != "" {
49-
gitRepo, err := fetchGitRepositoryFromRubyGems(rubygems)
47+
gitRepo, err := fetchGitRepositoryFromRubyGems(rubygems, manager)
5048
return packageMangerResponse{
5149
exists: true,
5250
associatedRepo: gitRepo,
@@ -79,14 +77,9 @@ type rubyGemsSearchResults struct {
7977
}
8078

8179
// Gets the GitHub repository URL for the npm package.
82-
// nolint: noctx
83-
func fetchGitRepositoryFromNPM(packageName string) (string, error) {
80+
func fetchGitRepositoryFromNPM(packageName string, packageManager packageManagerClient) (string, error) {
8481
npmSearchURL := "https://registry.npmjs.org/-/v1/search?text=%s&size=1"
85-
const timeout = 10
86-
client := &http.Client{
87-
Timeout: timeout * time.Second,
88-
}
89-
resp, err := client.Get(fmt.Sprintf(npmSearchURL, packageName))
82+
resp, err := packageManager.Get(npmSearchURL, packageName)
9083
if err != nil {
9184
return "", sce.WithMessage(sce.ErrScorecardInternal, fmt.Sprintf("failed to get npm package json: %v", err))
9285
}
@@ -105,14 +98,9 @@ func fetchGitRepositoryFromNPM(packageName string) (string, error) {
10598
}
10699

107100
// Gets the GitHub repository URL for the pypi package.
108-
// nolint: noctx
109-
func fetchGitRepositoryFromPYPI(packageName string) (string, error) {
101+
func fetchGitRepositoryFromPYPI(packageName string, manager packageManagerClient) (string, error) {
110102
pypiSearchURL := "https://pypi.org/pypi/%s/json"
111-
const timeout = 10
112-
client := &http.Client{
113-
Timeout: timeout * time.Second,
114-
}
115-
resp, err := client.Get(fmt.Sprintf(pypiSearchURL, packageName))
103+
resp, err := manager.Get(pypiSearchURL, packageName)
116104
if err != nil {
117105
return "", sce.WithMessage(sce.ErrScorecardInternal, fmt.Sprintf("failed to get pypi package json: %v", err))
118106
}
@@ -131,14 +119,9 @@ func fetchGitRepositoryFromPYPI(packageName string) (string, error) {
131119
}
132120

133121
// Gets the GitHub repository URL for the rubygems package.
134-
// nolint: noctx
135-
func fetchGitRepositoryFromRubyGems(packageName string) (string, error) {
122+
func fetchGitRepositoryFromRubyGems(packageName string, manager packageManagerClient) (string, error) {
136123
rubyGemsSearchURL := "https://rubygems.org/api/v1/gems/%s.json"
137-
const timeout = 10
138-
client := &http.Client{
139-
Timeout: timeout * time.Second,
140-
}
141-
resp, err := client.Get(fmt.Sprintf(rubyGemsSearchURL, packageName))
124+
resp, err := manager.Get(rubyGemsSearchURL, packageName)
142125
if err != nil {
143126
return "", sce.WithMessage(sce.ErrScorecardInternal, fmt.Sprintf("failed to get ruby gem json: %v", err))
144127
}

0 commit comments

Comments
 (0)