Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions pkg/cmd/coverage.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"
"net/url"
"os"
"sort"

"github.com/gookit/color"
"github.com/spf13/cobra"
Expand All @@ -28,6 +29,7 @@ func NewCoverageCommand() *cobra.Command {
f.Int("coverage-relationships", 0, "the min coverage for relationships")
f.Int("coverage-attributes", 0, "the min coverage for attributes")
f.Int("coverage-assertions", 0, "the min coverage for assertions")
f.Int("coverage-conditions", 0, "the min coverage for permission condition components")

// register flags for coverage
command.PreRun = func(cmd *cobra.Command, args []string) {
Expand All @@ -49,6 +51,7 @@ func coverage() func(cmd *cobra.Command, args []string) error {
coverageRelationships := viper.GetInt("coverage-relationships") // Min relationships coverage
coverageAttributes := viper.GetInt("coverage-attributes")
coverageAssertions := viper.GetInt("coverage-assertions") // Min assertions coverage
coverageConditions := viper.GetInt("coverage-conditions")
// Create decoder from URL
// create a new decoder from the url
decoder, err := file.NewDecoderFromURL(u)
Expand Down Expand Up @@ -105,6 +108,12 @@ func coverage() func(cmd *cobra.Command, args []string) error {
color.Danger.Println("FAILED")
os.Exit(1)
}

if schemaCoverageInfo.TotalConditionsCoverage < coverageConditions {
color.Danger.Printf("permission condition coverage < %d%%\n", coverageConditions)
color.Danger.Println("FAILED")
os.Exit(1)
}
return nil
}
}
Expand All @@ -131,6 +140,8 @@ func DisplayCoverageInfo(schemaCoverageInfo cov.SchemaCoverageInfo) {
}
}

displayConditionCoverage(entityCoverageInfo)

fmt.Printf(" coverage relationships percentage:")

if entityCoverageInfo.CoverageRelationshipsPercent <= 50 {
Expand Down Expand Up @@ -159,3 +170,46 @@ func DisplayCoverageInfo(schemaCoverageInfo cov.SchemaCoverageInfo) {
}
}
}

func displayConditionCoverage(entityCoverageInfo cov.EntityCoverageInfo) {
if len(entityCoverageInfo.PermissionConditionCoverage) == 0 {
return
}

fmt.Printf(" permission condition coverage:\n")

scenarioNames := make([]string, 0, len(entityCoverageInfo.PermissionConditionCoverage))
for scenarioName := range entityCoverageInfo.PermissionConditionCoverage {
scenarioNames = append(scenarioNames, scenarioName)
}
sort.Strings(scenarioNames)

for _, scenarioName := range scenarioNames {
permissionCoverages := entityCoverageInfo.PermissionConditionCoverage[scenarioName]
if len(permissionCoverages) == 0 {
continue
}

fmt.Printf(" %s:\n", scenarioName)

permissionNames := make([]string, 0, len(permissionCoverages))
for permissionName := range permissionCoverages {
permissionNames = append(permissionNames, permissionName)
}
sort.Strings(permissionNames)

for _, permissionName := range permissionNames {
conditionCoverage := permissionCoverages[permissionName]
fmt.Printf(" %s:", permissionName)
if conditionCoverage.CoveragePercent <= 50 {
color.Danger.Printf(" %d%%\n", conditionCoverage.CoveragePercent)
} else {
color.Success.Printf(" %d%%\n", conditionCoverage.CoveragePercent)
}

for _, component := range conditionCoverage.UncoveredComponents {
fmt.Printf(" - %s %s\n", component.Type, component.Name)
}
}
}
}
3 changes: 3 additions & 0 deletions pkg/cmd/flags/coverage.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,7 @@ func RegisterCoverageFlags(flags *pflag.FlagSet) {
if err := viper.BindPFlag("coverage-assertions", flags.Lookup("coverage-assertions")); err != nil {
panic(err)
}
if err := viper.BindPFlag("coverage-conditions", flags.Lookup("coverage-conditions")); err != nil {
panic(err)
}
}
Loading
Loading