Skip to content

Commit c4ae24b

Browse files
authored
Merge pull request #1047 from repository-settings/full-ruleset
2 parents 9be1122 + 86ebb4a commit c4ae24b

File tree

3 files changed

+53
-24
lines changed

3 files changed

+53
-24
lines changed

lib/plugins/rulesets.js

+10-4
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,29 @@ export default class Rulesets extends Diffable {
66
async find () {
77
const { data: rulesets } = await this.github.repos.getRepoRulesets(this.repo)
88

9-
return rulesets
9+
const expandedRulesetsData = await Promise.all(
10+
rulesets.map(({ id }) => this.github.repos.getRepoRuleset({ ...this.repo, ruleset_id: id }))
11+
)
12+
13+
return expandedRulesetsData.map(({ data }) => data)
1014
}
1115

1216
comparator (existing, attrs) {
1317
return existing.name === attrs.name
1418
}
1519

1620
changed (existing, attrs) {
17-
return !deepEqual(existing, attrs)
21+
const { id, ...existingAttrs } = existing
22+
23+
return !deepEqual(existingAttrs, attrs)
1824
}
1925

2026
update (existing, attrs) {
21-
return this.github.repos.updateRepoRuleset({ ...this.repo, ruleset_id: existing.ruleset_id, ...attrs })
27+
return this.github.repos.updateRepoRuleset({ ...this.repo, ruleset_id: existing.id, ...attrs })
2228
}
2329

2430
remove (existing) {
25-
return this.github.repos.deleteRepoRuleset({ ...this.repo, ruleset_id: existing.ruleset_id })
31+
return this.github.repos.deleteRepoRuleset({ ...this.repo, ruleset_id: existing.id })
2632
}
2733

2834
async add (attrs) {

test/integration/features/step_definitions/rulesets-steps.js

+13-12
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import any from '@travi/any'
1111

1212
const rulesetId = any.integer()
1313
const rulesetName = any.word()
14+
const existingRules = any.listOf(any.simpleObject)
1415

1516
Given('no rulesets are defined for the repository', async function () {
1617
this.server.use(
@@ -21,9 +22,15 @@ Given('no rulesets are defined for the repository', async function () {
2122
})
2223

2324
Given('a ruleset exists for the repository', async function () {
25+
const rulesetSubset = { name: rulesetName }
26+
2427
this.server.use(
2528
http.get(`https://api.github.com/repos/${repository.owner.name}/${repository.name}/rulesets`, ({ request }) =>
26-
HttpResponse.json([{ ruleset_id: rulesetId, name: rulesetName, enforcement: 'evaluate' }])
29+
HttpResponse.json([{ id: rulesetId, ...rulesetSubset }])
30+
),
31+
http.get(
32+
`https://api.github.com/repos/${repository.owner.name}/${repository.name}/rulesets/${rulesetId}`,
33+
({ request }) => HttpResponse.json({ id: rulesetId, ...rulesetSubset, rules: existingRules })
2734
)
2835
)
2936
})
@@ -50,26 +57,20 @@ Given('a ruleset is defined in the config', async function () {
5057
})
5158

5259
Given('the ruleset is modified in the config', async function () {
53-
this.ruleset = { name: rulesetName, enforcement: 'active' }
60+
const additionalRule = any.simpleObject()
61+
this.updatedRuleset = { name: rulesetName, rules: [...existingRules, additionalRule] }
5462

5563
this.server.use(
5664
http.get(
5765
`https://api.github.com/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(
5866
settings.FILE_NAME
5967
)}`,
60-
({ request }) =>
61-
HttpResponse.arrayBuffer(
62-
Buffer.from(
63-
dump({
64-
rulesets: [{ ruleset_id: rulesetId, ...this.ruleset }]
65-
})
66-
)
67-
)
68+
({ request }) => HttpResponse.arrayBuffer(Buffer.from(dump({ rulesets: [this.updatedRuleset] })))
6869
),
6970
http.put(
7071
`https://api.github.com/repos/${repository.owner.name}/${repository.name}/rulesets/${rulesetId}`,
7172
async ({ request }) => {
72-
this.updatedRuleset = await request.json()
73+
this.rulesetUpdate = await request.json()
7374

7475
return new HttpResponse(null, { status: StatusCodes.OK })
7576
}
@@ -101,7 +102,7 @@ Then('the ruleset is enabled for the repository', async function () {
101102
})
102103

103104
Then('the ruleset is updated', async function () {
104-
assert.deepEqual(this.updatedRuleset, this.ruleset)
105+
assert.deepEqual(this.rulesetUpdate, this.updatedRuleset)
105106
})
106107

107108
Then('the ruleset is deleted', async function () {

test/unit/lib/plugins/rulesets.test.js

+30-8
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,43 @@ describe('rulesets', () => {
1818
repos: {
1919
createRepoRuleset: jest.fn(),
2020
deleteRepoRuleset: jest.fn(),
21+
getRepoRuleset: jest.fn(),
2122
getRepoRulesets: jest.fn(),
2223
updateRepoRuleset: jest.fn()
2324
}
2425
}
2526
})
2627

2728
it('should sync rulesets', async () => {
28-
const updatedValue = any.word()
29+
const additionalRule = any.simpleObject()
2930
const existingRulesetId = any.integer()
31+
const secondExistingRulesetId = any.integer()
3032
const removedRulesetId = any.integer()
31-
const existingRuleset = { name: any.word(), foo: updatedValue }
33+
const existingRuleset = { name: any.word(), rules: [any.simpleObject()] }
34+
const secondExistingRuleset = { name: any.word(), rules: [any.simpleObject()] }
3235
const newRuleset = { name: any.word() }
33-
const plugin = configure(github, owner, repo, [newRuleset, existingRuleset])
36+
const plugin = configure(github, owner, repo, [
37+
newRuleset,
38+
{ ...existingRuleset, rules: [...existingRuleset.rules, additionalRule] },
39+
secondExistingRuleset
40+
])
41+
const existingRulesets = [
42+
{ id: existingRulesetId, ...existingRuleset },
43+
{ id: secondExistingRulesetId, ...secondExistingRuleset },
44+
{ id: removedRulesetId, name: any.word() }
45+
]
3446
when(github.repos.getRepoRulesets)
3547
.calledWith({ owner, repo })
3648
.mockResolvedValue({
37-
data: [
38-
{ ruleset_id: existingRulesetId, ...existingRuleset, foo: any.word() },
39-
{ ruleset_id: removedRulesetId, name: any.word() }
40-
]
49+
data: existingRulesets.map(
50+
({ rules, conditions, bypass_actors: bypassActors, ...rulesetListProperties }) => rulesetListProperties
51+
)
4152
})
53+
existingRulesets.forEach(ruleset => {
54+
when(github.repos.getRepoRuleset)
55+
.calledWith({ owner, repo, ruleset_id: ruleset.id })
56+
.mockResolvedValue({ data: ruleset })
57+
})
4258

4359
await plugin.sync()
4460

@@ -48,7 +64,13 @@ describe('rulesets', () => {
4864
repo,
4965
ruleset_id: existingRulesetId,
5066
...existingRuleset,
51-
foo: updatedValue
67+
rules: [...existingRuleset.rules, additionalRule]
68+
})
69+
expect(github.repos.updateRepoRuleset).not.toHaveBeenCalledWith({
70+
owner,
71+
repo,
72+
ruleset_id: secondExistingRulesetId,
73+
...secondExistingRuleset
5274
})
5375
expect(github.repos.deleteRepoRuleset).toHaveBeenCalledWith({ owner, repo, ruleset_id: removedRulesetId })
5476
})

0 commit comments

Comments
 (0)