Skip to content

Commit

Permalink
fix: fix the usage of TeamProjectValidation
Browse files Browse the repository at this point in the history
...and add respective tests
  • Loading branch information
pieterlukasse committed Dec 11, 2023
1 parent 522afa0 commit e76c6bc
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 6 deletions.
33 changes: 27 additions & 6 deletions controllers/concept.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,13 +93,20 @@ func (u ConceptController) RetrieveInfoBySourceIdAndConceptTypes(c *gin.Context)

func (u ConceptController) RetrieveBreakdownStatsBySourceIdAndCohortId(c *gin.Context) {
sourceId, cohortId, err := utils.ParseSourceAndCohortId(c)
validRequest := u.teamProjectAuthz.TeamProjectValidationForCohort(c, cohortId)
if err != nil || !validRequest {
if err != nil {
log.Printf("Error: %s", err.Error())
c.JSON(http.StatusBadRequest, gin.H{"message": "bad request", "error": err.Error()})
c.Abort()
return
}
validAccessRequest := u.teamProjectAuthz.TeamProjectValidationForCohort(c, cohortId)
if !validAccessRequest {
log.Printf("Error: invalid request")
c.JSON(http.StatusBadRequest, gin.H{"message": "access denied"})
c.Abort()
return
}

breakdownConceptId, err := utils.ParseBigNumericArg(c, "breakdownconceptid")
if err != nil {
log.Printf("Error: %s", err.Error())
Expand All @@ -119,13 +126,20 @@ func (u ConceptController) RetrieveBreakdownStatsBySourceIdAndCohortId(c *gin.Co

func (u ConceptController) RetrieveBreakdownStatsBySourceIdAndCohortIdAndVariables(c *gin.Context) {
sourceId, cohortId, conceptIds, cohortPairs, err := utils.ParseSourceIdAndCohortIdAndVariablesList(c)
validRequest := u.teamProjectAuthz.TeamProjectValidation(c, cohortId, cohortPairs)
if err != nil || !validRequest {
if err != nil {
log.Printf("Error: %s", err.Error())
c.JSON(http.StatusBadRequest, gin.H{"message": "bad request", "error": err.Error()})
c.Abort()
return
}
validAccessRequest := u.teamProjectAuthz.TeamProjectValidation(c, cohortId, cohortPairs)
if !validAccessRequest {
log.Printf("Error: invalid request")
c.JSON(http.StatusBadRequest, gin.H{"message": "access denied"})
c.Abort()
return
}

breakdownConceptId, err := utils.ParseBigNumericArg(c, "breakdownconceptid")
if err != nil {
log.Printf("Error: %s", err.Error())
Expand Down Expand Up @@ -178,13 +192,20 @@ func generateRowForVariable(variableName string, breakdownConceptValuesToPeopleC
func (u ConceptController) RetrieveAttritionTable(c *gin.Context) {
sourceId, cohortId, conceptIdsAndCohortPairs, err := utils.ParseSourceIdAndCohortIdAndVariablesAsSingleList(c)
_, cohortPairs := utils.GetConceptIdsAndCohortPairsAsSeparateLists(conceptIdsAndCohortPairs)
validRequest := u.teamProjectAuthz.TeamProjectValidation(c, cohortId, cohortPairs)
if err != nil || !validRequest {
if err != nil {
log.Printf("Error: %s", err.Error())
c.JSON(http.StatusBadRequest, gin.H{"message": "bad request", "error": err.Error()})
c.Abort()
return
}
validAccessRequest := u.teamProjectAuthz.TeamProjectValidation(c, cohortId, cohortPairs)
if !validAccessRequest {
log.Printf("Error: invalid request")
c.JSON(http.StatusBadRequest, gin.H{"message": "access denied"})
c.Abort()
return
}

breakdownConceptId, err := utils.ParseBigNumericArg(c, "breakdownconceptid")
if err != nil {
log.Printf("Error: %s", err.Error())
Expand Down
63 changes: 63 additions & 0 deletions tests/controllers_tests/controllers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,18 @@ func (h dummyTeamProjectAuthz) TeamProjectValidation(ctx *gin.Context, cohortDef
return true
}

type dummyFailingTeamProjectAuthz struct{}

func (h dummyFailingTeamProjectAuthz) TeamProjectValidationForCohort(ctx *gin.Context, cohortDefinitionId int) bool {
return false
}

func (h dummyFailingTeamProjectAuthz) TeamProjectValidation(ctx *gin.Context, cohortDefinitionId int, filterCohortPairs []utils.CustomDichotomousVariableDef) bool {
return false
}

var conceptController = controllers.NewConceptController(*new(dummyConceptDataModel), *new(dummyCohortDefinitionDataModel), *new(dummyTeamProjectAuthz))
var conceptControllerWithFailingTeamProjectAuthz = controllers.NewConceptController(*new(dummyConceptDataModel), *new(dummyCohortDefinitionDataModel), *new(dummyFailingTeamProjectAuthz))

type dummyConceptDataModel struct{}

Expand Down Expand Up @@ -461,6 +472,34 @@ func TestRetriveByIdModelError(t *testing.T) {
}
}

func TestRetrieveBreakdownStatsBySourceIdAndCohortId(t *testing.T) {
setUp(t)
requestContext := new(gin.Context)
requestContext.Params = append(requestContext.Params, gin.Param{Key: "sourceid", Value: "1"})
requestContext.Params = append(requestContext.Params, gin.Param{Key: "cohortid", Value: "1"})
requestContext.Params = append(requestContext.Params, gin.Param{Key: "breakdownconceptid", Value: "1"})

requestContext.Writer = new(tests.CustomResponseWriter)
conceptController.RetrieveBreakdownStatsBySourceIdAndCohortId(requestContext)
result := requestContext.Writer.(*tests.CustomResponseWriter)
log.Printf("result: %s", result)
// expect result with dummy data:
if !strings.Contains(result.CustomResponseWriterOut, "persons_in_cohort_with_value") {
t.Errorf("Expected data in result")
}

// the same request should fail if the teamProject authorization fails:
conceptControllerWithFailingTeamProjectAuthz.RetrieveBreakdownStatsBySourceIdAndCohortId(requestContext)
result = requestContext.Writer.(*tests.CustomResponseWriter)
// expect error:
if !strings.Contains(result.CustomResponseWriterOut, "access denied") {
t.Errorf("Expected 'access denied' as result")
}
if !requestContext.IsAborted() {
t.Errorf("Expected request to be aborted")
}
}

func TestRetrieveBreakdownStatsBySourceIdAndCohortIdAndVariables(t *testing.T) {
setUp(t)
requestContext := new(gin.Context)
Expand All @@ -479,6 +518,18 @@ func TestRetrieveBreakdownStatsBySourceIdAndCohortIdAndVariables(t *testing.T) {
if !strings.Contains(result.CustomResponseWriterOut, "persons_in_cohort_with_value") {
t.Errorf("Expected data in result")
}

// the same request should fail if the teamProject authorization fails:
requestContext.Request.Body = io.NopCloser(strings.NewReader(requestBody))
conceptControllerWithFailingTeamProjectAuthz.RetrieveBreakdownStatsBySourceIdAndCohortIdAndVariables(requestContext)
result = requestContext.Writer.(*tests.CustomResponseWriter)
// expect error:
if !strings.Contains(result.CustomResponseWriterOut, "access denied") {
t.Errorf("Expected 'access denied' as result")
}
if !requestContext.IsAborted() {
t.Errorf("Expected request to be aborted")
}
}

func TestRetrieveBreakdownStatsBySourceIdAndCohortIdAndVariablesModelError(t *testing.T) {
Expand Down Expand Up @@ -899,4 +950,16 @@ func TestRetrieveAttritionTable(t *testing.T) {
}
i++
}

// the same request should fail if the teamProject authorization fails:
requestContext.Request.Body = io.NopCloser(strings.NewReader(requestBody))
conceptControllerWithFailingTeamProjectAuthz.RetrieveAttritionTable(requestContext)
result = requestContext.Writer.(*tests.CustomResponseWriter)
// expect error:
if !strings.Contains(result.CustomResponseWriterOut, "access denied") {
t.Errorf("Expected 'access denied' as result")
}
if !requestContext.IsAborted() {
t.Errorf("Expected request to be aborted")
}
}

0 comments on commit e76c6bc

Please sign in to comment.