func NewOperationPropertiesCoverageReport()

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
}