mirror of
https://github.com/kubescape/kubescape.git
synced 2026-04-15 06:58:11 +00:00
225 lines
6.0 KiB
Go
225 lines
6.0 KiB
Go
package resourcehandler
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
var (
|
|
urlA = "https://github.com/kubescape/kubescape"
|
|
urlB = "https://github.com/kubescape/kubescape/blob/master/examples/online-boutique/adservice.yaml"
|
|
urlC = "https://github.com/kubescape/kubescape/tree/master/examples/online-boutique"
|
|
// urlD = "https://raw.githubusercontent.com/kubescape/kubescape/master/examples/online-boutique/adservice.yaml"
|
|
)
|
|
|
|
var mockTree = tree{
|
|
InnerTrees: []innerTree{
|
|
{Path: "charts/fluent-bit/values.yaml"},
|
|
{Path: "charts/fluent-bit/templates/configmap.yaml"},
|
|
{Path: "charts/other-chart/templates/deployment.yaml"},
|
|
{Path: "README.md"},
|
|
},
|
|
}
|
|
|
|
func newMockGitHubRepository(path string, isFile bool) *GitHubRepository {
|
|
return &GitHubRepository{
|
|
host: "github.com",
|
|
owner: "grafana",
|
|
repo: "helm-charts",
|
|
branch: "main",
|
|
path: path,
|
|
isFile: isFile,
|
|
tree: mockTree,
|
|
}
|
|
}
|
|
|
|
/*
|
|
|
|
TODO: tests were commented out due to actual http calls ; http calls should be mocked.
|
|
|
|
func TestScanRepository(t *testing.T) {
|
|
{
|
|
files, err := ScanRepository(urlA, "")
|
|
assert.NoError(t, err)
|
|
assert.Less(t, 0, len(files))
|
|
}
|
|
{
|
|
files, err := ScanRepository(urlB, "")
|
|
assert.NoError(t, err)
|
|
assert.Less(t, 0, len(files))
|
|
}
|
|
{
|
|
files, err := ScanRepository(urlC, "")
|
|
assert.NoError(t, err)
|
|
assert.Less(t, 0, len(files))
|
|
}
|
|
{
|
|
files, err := ScanRepository(urlD, "")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 1, len(files))
|
|
}
|
|
|
|
}
|
|
|
|
func TestGetHost(t *testing.T) {
|
|
{
|
|
host, err := getHost(urlA)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "github.com", host)
|
|
}
|
|
{
|
|
host, err := getHost(urlB)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "github.com", host)
|
|
}
|
|
{
|
|
host, err := getHost(urlC)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "github.com", host)
|
|
}
|
|
{
|
|
host, err := getHost(urlD)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "raw.githubusercontent.com", host)
|
|
}
|
|
}
|
|
|
|
func TestGithubSetBranch(t *testing.T) {
|
|
{
|
|
gh := NewGitHubRepository()
|
|
assert.NoError(t, gh.parse(urlA))
|
|
assert.NoError(t, gh.setBranch(""))
|
|
assert.Equal(t, "master", gh.getBranch())
|
|
}
|
|
{
|
|
gh := NewGitHubRepository()
|
|
assert.NoError(t, gh.parse(urlB))
|
|
err := gh.setBranch("dev")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "dev", gh.getBranch())
|
|
}
|
|
}
|
|
|
|
func TestGithubSetTree(t *testing.T) {
|
|
{
|
|
gh := NewGitHubRepository()
|
|
assert.NoError(t, gh.parse(urlA))
|
|
assert.NoError(t, gh.setBranch(""))
|
|
err := gh.setTree()
|
|
assert.NoError(t, err)
|
|
assert.Less(t, 0, len(gh.getTree().InnerTrees))
|
|
}
|
|
}
|
|
func TestGithubGetYamlFromTree(t *testing.T) {
|
|
{
|
|
gh := NewGitHubRepository()
|
|
assert.NoError(t, gh.parse(urlA))
|
|
assert.NoError(t, gh.setBranch(""))
|
|
assert.NoError(t, gh.setTree())
|
|
files := gh.getFilesFromTree([]string{"yaml"})
|
|
assert.Less(t, 0, len(files))
|
|
}
|
|
{
|
|
gh := NewGitHubRepository()
|
|
assert.NoError(t, gh.parse(urlB))
|
|
assert.NoError(t, gh.setBranch(""))
|
|
assert.NoError(t, gh.setTree())
|
|
files := gh.getFilesFromTree([]string{"yaml"})
|
|
assert.Equal(t, 1, len(files))
|
|
}
|
|
{
|
|
gh := NewGitHubRepository()
|
|
assert.NoError(t, gh.parse(urlC))
|
|
assert.NoError(t, gh.setBranch(""))
|
|
assert.NoError(t, gh.setTree())
|
|
files := gh.getFilesFromTree([]string{"yaml"})
|
|
assert.Equal(t, 12, len(files))
|
|
}
|
|
}
|
|
*/
|
|
|
|
func TestGithubParse(t *testing.T) {
|
|
{
|
|
gh := NewGitHubRepository()
|
|
assert.NoError(t, gh.parse(urlA))
|
|
assert.Equal(t, "kubescape/kubescape", joinOwnerNRepo(gh.owner, gh.repo))
|
|
}
|
|
{
|
|
gh := NewGitHubRepository()
|
|
assert.NoError(t, gh.parse(urlB))
|
|
assert.Equal(t, "kubescape/kubescape", joinOwnerNRepo(gh.owner, gh.repo))
|
|
assert.Equal(t, "master", gh.branch)
|
|
assert.Equal(t, "examples/online-boutique/adservice.yaml", gh.path)
|
|
assert.True(t, gh.isFile)
|
|
assert.Equal(t, 1, len(gh.getFilesFromTree([]string{"yaml"})))
|
|
assert.Equal(t, 0, len(gh.getFilesFromTree([]string{"yml"})))
|
|
}
|
|
{
|
|
gh := NewGitHubRepository()
|
|
assert.NoError(t, gh.parse(urlC))
|
|
assert.Equal(t, "kubescape/kubescape", joinOwnerNRepo(gh.owner, gh.repo))
|
|
assert.Equal(t, "master", gh.branch)
|
|
assert.Equal(t, "examples/online-boutique", gh.path)
|
|
assert.False(t, gh.isFile)
|
|
}
|
|
}
|
|
|
|
func TestGetFilesFromTree(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
repo *GitHubRepository
|
|
extensions []string
|
|
expectedResults []string
|
|
}{
|
|
{
|
|
name: "Scan entire repo for YAML files",
|
|
repo: newMockGitHubRepository("", false),
|
|
extensions: []string{"yaml", "yml"},
|
|
expectedResults: []string{
|
|
"https://raw.githubusercontent.com/grafana/helm-charts/main/charts/fluent-bit/values.yaml",
|
|
"https://raw.githubusercontent.com/grafana/helm-charts/main/charts/fluent-bit/templates/configmap.yaml",
|
|
"https://raw.githubusercontent.com/grafana/helm-charts/main/charts/other-chart/templates/deployment.yaml",
|
|
},
|
|
},
|
|
{
|
|
name: "Scan specific folder (fluent-bit) for YAML files",
|
|
repo: newMockGitHubRepository("charts/fluent-bit", false),
|
|
extensions: []string{"yaml", "yml"},
|
|
expectedResults: []string{
|
|
"https://raw.githubusercontent.com/grafana/helm-charts/main/charts/fluent-bit/values.yaml",
|
|
"https://raw.githubusercontent.com/grafana/helm-charts/main/charts/fluent-bit/templates/configmap.yaml",
|
|
},
|
|
},
|
|
{
|
|
name: "Scan root with non-matching extension (JSON)",
|
|
repo: newMockGitHubRepository("", false),
|
|
extensions: []string{"json"},
|
|
expectedResults: []string{},
|
|
},
|
|
{
|
|
name: "Scan specific file",
|
|
repo: newMockGitHubRepository("charts/fluent-bit/values.yaml", true),
|
|
extensions: []string{"yaml"},
|
|
expectedResults: []string{
|
|
"https://raw.githubusercontent.com/grafana/helm-charts/main/charts/fluent-bit/values.yaml",
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got := tt.repo.getFilesFromTree(tt.extensions)
|
|
|
|
if len(got) == 0 && len(tt.expectedResults) == 0 {
|
|
return // both are empty, so this test case passes
|
|
}
|
|
|
|
if !reflect.DeepEqual(got, tt.expectedResults) {
|
|
t.Errorf("getFilesFromTree() = %v, want %v", got, tt.expectedResults)
|
|
}
|
|
})
|
|
}
|
|
}
|