in coverage/operation_properties_coverage.go [14:82]
func NewOperationPropertiesCoverageReport(traceDir string, swaggerPath string) (*CoverageReport, error) {
files, err := os.ReadDir(traceDir)
if err != nil {
return nil, err
}
report := &CoverageReport{
Coverages: make(map[string]*CoverageItem),
}
for _, file := range files {
if !strings.HasSuffix(file.Name(), ".json") {
continue
}
data, err := os.ReadFile(path.Join(traceDir, file.Name()))
if err != nil {
logrus.Warnf("failed to read file %s: %+v", file.Name(), err)
continue
}
var trace formatter.OavTraffic
if err := json.Unmarshal(data, &trace); err != nil {
logrus.Warnf("failed to unmarshal file %s: %+v", file.Name(), err)
continue
}
swaggerModel, err := GetModelInfoFromLocalDir(removeQueryParameters(trace.LiveRequest.Url), swaggerPath, trace.LiveRequest.Method)
if err != nil {
logrus.Warnf("failed to get model info from local dir: %+v", err)
continue
}
if swaggerModel == nil {
// the API is not in the swagger file, usually it's an API that out of the testing scope
continue
}
index := fmt.Sprintf("%s-%s", trace.LiveRequest.Method, swaggerModel.ApiPath)
if swaggerModel.ModelName == "" {
// the API has no request body, mark it as fully covered
report.Coverages[index] = &CoverageItem{
ApiPath: swaggerModel.ApiPath,
DisplayName: swaggerModel.OperationID,
Model: &Model{
IsFullyCovered: true,
},
}
continue
}
if _, ok := report.Coverages[index]; !ok {
expanded, err := Expand(swaggerModel.ModelName, swaggerModel.SwaggerPath)
if err != nil {
logrus.Warnf("failed to expand model %s property: %+v", swaggerModel.ModelName, err)
continue
}
report.Coverages[index] = &CoverageItem{
ApiPath: swaggerModel.ApiPath,
DisplayName: swaggerModel.OperationID,
Model: expanded,
}
}
report.Coverages[index].Model.MarkCovered(trace.LiveRequest.Body)
report.Coverages[index].Model.CountCoverage()
}
return report, nil
}