diff --git a/src/GitLabHealth-Model-Analysis-Tests/MergeRequestMergedByUserMetricTest.class.st b/src/GitLabHealth-Model-Analysis-Tests/MergeRequestMergedByUserMetricTest.class.st new file mode 100644 index 0000000..44afbd8 --- /dev/null +++ b/src/GitLabHealth-Model-Analysis-Tests/MergeRequestMergedByUserMetricTest.class.st @@ -0,0 +1,286 @@ +" +A MergedMergeRequestMetricTest is a test class for testing the behavior of MergedMergeRequestMetric +" +Class { + #name : #MergeRequestMergedByUserMetricTest, + #superclass : #UserMetricTest, + #category : #'GitLabHealth-Model-Analysis-Tests' +} + +{ #category : #tests } +MergeRequestMergedByUserMetricTest >> testCalculate [ + + | result glhImporter mergedMergeRequest | + "Given" + + + glhImporter := GLPHImporterMock new. + glhImporter mergeRequests: { + (GLHMergeRequest new + author: user; + merge_user: user; + project: project1; + created_at: createdAt ; + merged_at: mergedAt ). + + (GLHMergeRequest new + author: user; + merge_user: user; + project: project1; + created_at: createdAt - 20 days; + merged_at: nil) }. + + + mergedMergeRequest := MergeRequestMergedByUserMetric new + user: user; + glhImporter: glhImporter; + setPeriodSince: since + until: until; + over: Week. + + "When" + result := mergedMergeRequest calculate. + + "Then" + self assert: result equals: 1 +] + +{ #category : #tests } +MergeRequestMergedByUserMetricTest >> testCalculate1MRInPeriod1Outside [ + + | result glhImporter mergedMergeRequest | + "Given" + glhImporter := GLPHImporterMock new. + glhImporter mergeRequests: { + (GLHMergeRequest new + author: user; + project: project1; + merge_user: user; + created_at: createdAt; + merged_at: mergedAt). + + "open but merged anotherWeek" + (GLHMergeRequest new + author: user; + merge_user: user; + project: project1; + created_at: createdAt; + merged_at: createdAt + 10 days) }. + "open and merge during the same week" + + + mergedMergeRequest := MergeRequestMergedByUserMetric new + user: user; + glhImporter: glhImporter; + setPeriodSince: since until: until; + over: Week. + + "When" + result := mergedMergeRequest calculate. + + "Then" + self assert: result equals: 1 +] + +{ #category : #tests } +MergeRequestMergedByUserMetricTest >> testCalculate1MROpenedButNotMerged [ + + | result glhImporter mergedMergeRequest | + "Given" + glhImporter := GLPHImporterMock new. + glhImporter mergeRequests: { + (GLHMergeRequest new + author: user; + merge_user: user; + project: project1; + created_at: createdAt; + merged_at: mergedAt; + state: #merged). + + (GLHMergeRequest new + author: user; + project: project1; + created_at: createdAt; + state: #opened) }. + + + mergedMergeRequest := MergeRequestMergedByUserMetric new + user: user; + glhImporter: glhImporter; + setPeriodSince: since until: until; + over: Week. + + "When" + result := mergedMergeRequest calculate. + + "Then" + self assert: result equals: 1 +] + +{ #category : #tests } +MergeRequestMergedByUserMetricTest >> testCalculate2MROneForEachUser [ + + | result glhImporter mergedMergeRequest user2 | + "Given" + + + user2 := GLHUser new + name: 'user2'; + id: 2; + contributedProjects: { project1 }. + + glhImporter := GLPHImporterMock new. + glhImporter mergeRequests: { + (GLHMergeRequest new + author: user; + title: 'MR1'; + project: project1; + created_at: createdAt; + merge_user: user; + merged_at: mergedAt). + (GLHMergeRequest new + author: user2; + title: 'MR2'; + project: project1; + created_at: createdAt; + merge_user: user2; + merged_at: mergedAt) }. + + + mergedMergeRequest := MergeRequestMergedByUserMetric new + user: user; + glhImporter: glhImporter; + setPeriodSince: since until: until; + over: Week. + + "When" + result := mergedMergeRequest calculate. + + "Then" + self assert: result equals: 1 +] + +{ #category : #tests } +MergeRequestMergedByUserMetricTest >> testCalculate3MROpenButMergedByOthers [ + + | result glhImporter mergedMergeRequest user2 | + "Given" + + + user2 := GLHUser new + name: 'user2'; + id: 2; + contributedProjects: + { project1 }. + + glhImporter := GLPHImporterMock new. + glhImporter mergeRequests: { + (GLHMergeRequest new + author: user; + title: 'MR1'; + created_at: createdAt; + merge_user: user2; + merged_at: mergedAt ). + (GLHMergeRequest new + author: user; + title: 'MR2'; + created_at: createdAt ; + merge_user: user2; + merged_at: mergedAt ). + (GLHMergeRequest new + author: user; + title: 'MR3'; + created_at: createdAt ; + merge_user: user2; + merged_at: mergedAt ) }. + + + mergedMergeRequest := MergeRequestMergedByUserMetric new + user: user; + glhImporter: glhImporter; + setPeriodSince: since + until: until; + over: Week. + + "When" + result := mergedMergeRequest calculate. + + "Then" + self assert: result equals: 0 +] + +{ #category : #tests } +MergeRequestMergedByUserMetricTest >> testCalculate3MROpenByOther [ + + | result glhImporter mergedMergeRequest user2 | + "Given" + + user2 := GLHUser new + name: 'user2'; + id: 2; + contributedProjects: + { project1 }. + + glhImporter := GLPHImporterMock new. + glhImporter mergeRequests: { + (GLHMergeRequest new + author: user2; + title: 'MR1'; + created_at: createdAt ; + merge_user: user; + project: project1 ; + state: #merged; + merged_at: mergedAt ). + (GLHMergeRequest new + author: user2; + state: #merged; + title: 'MR2'; + created_at: createdAt ; + project: project1 ; + merge_user: user; + merged_at: mergedAt ). + (GLHMergeRequest new + author: user2; + state: #merged; + title: 'MR3'; + created_at: createdAt ; + project: project1 ; + merge_user: user; + merged_at: mergedAt ) }. + + + mergedMergeRequest := MergeRequestMergedByUserMetric new + user: user; + glhImporter: glhImporter; + setPeriodSince: since + until: until; + over: Week. + + "When" + result := mergedMergeRequest calculate. + + "Then" + self assert: result equals: 3 +] + +{ #category : #tests } +MergeRequestMergedByUserMetricTest >> testCalculateNoMergeRequests [ + + | result glhImporter mergedMergeRequest | + "Given" + glhImporter := GLPHImporterMock new. + + + mergedMergeRequest := MergeRequestMergedByUserMetric new + user: user; + glhImporter: glhImporter; + setPeriodSince: since + until: until; + over: Week. + + "When" + result := mergedMergeRequest calculate. + + "Then" + self assert: result equals: 0 +] diff --git a/src/GitLabHealth-Model-Analysis-Tests/MergedMergeRequestMetricTest.class.st b/src/GitLabHealth-Model-Analysis-Tests/MergedMergeRequestMetricTest.class.st index b52ee8e..88d4056 100644 --- a/src/GitLabHealth-Model-Analysis-Tests/MergedMergeRequestMetricTest.class.st +++ b/src/GitLabHealth-Model-Analysis-Tests/MergedMergeRequestMetricTest.class.st @@ -45,6 +45,80 @@ MergedMergeRequestMetricTest >> testCalculate [ self assert: result equals: 1 ] +{ #category : #tests } +MergedMergeRequestMetricTest >> testCalculate1MRCreatedBeforeAndMergeAfterPeriod [ + + | result glhImporter mergedMergeRequest | + "Given" + glhImporter := GLPHImporterMock new. + glhImporter mergeRequests: { + (GLHMergeRequest new + author: user; + project: project1; + merge_user: user; + created_at: createdAt; + merged_at: mergedAt). + + "opened anotherWeek" + (GLHMergeRequest new + author: user; + merge_user: user; + project: project1; + created_at: createdAt - 10 days; + merged_at: createdAt + 10 days) }. + "open and merge during the same week" + + + mergedMergeRequest := MergedMergeRequestMetric new + user: user; + glhImporter: glhImporter; + setPeriodSince: since until: until; + over: Week. + + "When" + result := mergedMergeRequest calculate. + + "Then" + self assert: result equals: 1 +] + +{ #category : #tests } +MergedMergeRequestMetricTest >> testCalculate1MRCreatedBeforePeriod [ + + | result glhImporter mergedMergeRequest | + "Given" + glhImporter := GLPHImporterMock new. + glhImporter mergeRequests: { + (GLHMergeRequest new + author: user; + project: project1; + merge_user: user; + created_at: createdAt; + merged_at: mergedAt). + + "opened anotherWeek" + (GLHMergeRequest new + author: user; + merge_user: user; + project: project1; + created_at: createdAt - 10 days; + merged_at: createdAt) }. + "open and merge during the same week" + + + mergedMergeRequest := MergedMergeRequestMetric new + user: user; + glhImporter: glhImporter; + setPeriodSince: since until: until; + over: Week. + + "When" + result := mergedMergeRequest calculate. + + "Then" + self assert: result equals: 2 +] + { #category : #tests } MergedMergeRequestMetricTest >> testCalculate1MRInPeriod1Outside [ @@ -120,7 +194,7 @@ MergedMergeRequestMetricTest >> testCalculate1MROpenedButNotMerged [ { #category : #tests } MergedMergeRequestMetricTest >> testCalculate2MROneForEachUser [ - | result glhImporter mergedMergeRequest user2 | + | result glhImporter mergedMergeRequest user2 | "Given" @@ -212,55 +286,52 @@ MergedMergeRequestMetricTest >> testCalculate3MROpenButMergedByOthers [ { #category : #tests } MergedMergeRequestMetricTest >> testCalculate3MROpenByOther [ - | result glhImporter mergedMergeRequest user2 | + | result glhImporter mergedMergeRequest user2 | "Given" - user2 := GLHUser new name: 'user2'; id: 2; - contributedProjects: - { project1 }. + contributedProjects: { project1 }. glhImporter := GLPHImporterMock new. glhImporter mergeRequests: { (GLHMergeRequest new author: user2; title: 'MR1'; - created_at: createdAt ; + created_at: createdAt; merge_user: user; - project: project1 ; - state: #merged; - merged_at: mergedAt ). + project: project1; + state: #merged; + merged_at: mergedAt). (GLHMergeRequest new author: user2; - state: #merged; + state: #merged; title: 'MR2'; - created_at: createdAt ; - project: project1 ; + created_at: createdAt; + project: project1; merge_user: user; - merged_at: mergedAt ). + merged_at: mergedAt). (GLHMergeRequest new author: user2; - state: #merged; + state: #merged; title: 'MR3'; - created_at: createdAt ; - project: project1 ; + created_at: createdAt; + project: project1; merge_user: user; - merged_at: mergedAt ) }. + merged_at: mergedAt) }. mergedMergeRequest := MergedMergeRequestMetric new user: user; glhImporter: glhImporter; - setPeriodSince: since - until: until; + setPeriodSince: since until: until; over: Week. "When" result := mergedMergeRequest calculate. "Then" - self assert: result equals: 3 + self assert: result equals: 0 ] { #category : #tests } diff --git a/src/GitLabHealth-Model-Analysis/MergeRequestMergedByUserMetric.class.st b/src/GitLabHealth-Model-Analysis/MergeRequestMergedByUserMetric.class.st new file mode 100644 index 0000000..fe35e94 --- /dev/null +++ b/src/GitLabHealth-Model-Analysis/MergeRequestMergedByUserMetric.class.st @@ -0,0 +1,57 @@ +Class { + #name : #MergeRequestMergedByUserMetric, + #superclass : #UserMergeRequestMetric, + #instVars : [ + 'allMergeRequestDuringPeriod' + ], + #category : #'GitLabHealth-Model-Analysis' +} + +{ #category : #calculating } +MergeRequestMergedByUserMetric >> calculate [ + + | groupedByDate userMergedMergeRequests dateOver | + allMergeRequestDuringPeriod ifNil: [ self load ]. + + groupedByDate := self setupGroupedDate. + + "filter to see the MR associated to one user" + userMergedMergeRequests := allMergeRequestDuringPeriod select: [ + :userMergeRequest | + userMergeRequest merge_user isNotNil + and: [ + userMergeRequest merge_user id = user id ] ]. + + "filter to reject MR that are not merge" + userMergedMergeRequests := userMergedMergeRequests reject: [ :mr | + mr merged_at isNil ]. + + userMergedMergeRequests do: [ :userMergeRequest | "here we look at the specific date of its merged" + dateOver := self transformDate: userMergeRequest merged_at to: over. + groupedByDate + at: dateOver printString + ifPresent: [ :value | value add: userMergeRequest ] ]. + groupedByDate := groupedByDate collect: [ :group | group size ]. + + ^ groupedByDate average asFloat +] + +{ #category : #accessing } +MergeRequestMergedByUserMetric >> description [ + + ^ 'number of merge request merged by this user' +] + +{ #category : #loading } +MergeRequestMergedByUserMetric >> load [ + + allMergeRequestDuringPeriod := self + loadMergeRequestsSince: (period at: #since) + until: (period at: #until) +] + +{ #category : #accessing } +MergeRequestMergedByUserMetric >> name [ + + ^ 'mergeRequestMergedByThisUser' +] diff --git a/src/GitLabHealth-Model-Analysis/MergedMergeRequestMetric.class.st b/src/GitLabHealth-Model-Analysis/MergedMergeRequestMetric.class.st index 5c94dcf..5357c35 100644 --- a/src/GitLabHealth-Model-Analysis/MergedMergeRequestMetric.class.st +++ b/src/GitLabHealth-Model-Analysis/MergedMergeRequestMetric.class.st @@ -1,3 +1,9 @@ +" +I compute the case where an MR has for author the _user_, and has been merged + +If the merge is merged by someone else, it counts since my _user_ created the MR +If the merge is created by someone else, and my _user_ merge it, it does not cound (the important is that the _user_ created it) +" Class { #name : #MergedMergeRequestMetric, #superclass : #UserMergeRequestMetric, @@ -7,22 +13,17 @@ Class { { #category : #calculating } MergedMergeRequestMetric >> calculate [ - | groupedByDate userMergedMergeRequests dateOver | - userMergeRequests ifNil: [ self load ]. + | groupedByDate dateOver | + userMergeRequests ifNil: [ self load ]. groupedByDate := self setupGroupedDate. - "filter to see the MR associated to one user" - userMergedMergeRequests := userMergeRequests select: [ - :userMergeRequest | - userMergeRequest merge_user isNotNil - and: [ userMergeRequest merge_user id = user id ] ]. - + "filter to reject MR that are not merge" - userMergedMergeRequests := userMergedMergeRequests reject: [ :mr | mr merged_at isNil ]. - - userMergedMergeRequests do: [ :userMergeRequest | - "here we look at the specific date of its merged" + userMergeRequests := userMergeRequests reject: [ :mr | + mr merged_at isNil ]. + + userMergeRequests do: [ :userMergeRequest | "here we look at the specific date of its merged" dateOver := self transformDate: userMergeRequest merged_at to: over. groupedByDate at: dateOver printString @@ -35,15 +36,7 @@ MergedMergeRequestMetric >> calculate [ { #category : #accessing } MergedMergeRequestMetric >> description [ - ^ 'number of merge request merged by this user' -] - -{ #category : #loading } -MergedMergeRequestMetric >> load [ - - userMergeRequests := self - loadMergeRequestsSince: (period at: #since) - until: (period at: #until) + ^ 'number of merge request created by this user that is merged' ] { #category : #accessing }