Skip to content

Commit

Permalink
KeepPrivateModule: Special case for moving bug reports to MCL (#808)
Browse files Browse the repository at this point in the history
  • Loading branch information
violine1101 authored Jul 16, 2023
1 parent 59da59e commit ffd02af
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 20 deletions.
3 changes: 3 additions & 0 deletions config/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,9 @@ arisa:
keepPrivate:
tag: MEQS_KEEP_PRIVATE
message: panel-unmark-private-issue
privateLevels:
- '10318' # most projects
- '10502' # just MCL

privateDuplicate:
resolutions:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,9 @@ object Arisa : ConfigSpec() {
description = "The key of the message that is posted when this module succeeds."
)
val tag by optional<String?>(null)
val privateLevels by required<Set<String>>(
description = "All levels used to denote private security level"
)
}

object PrivateDuplicate : ModuleConfigSpec() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,20 @@ import java.time.Instant

class KeepPrivateModule(
private val keepPrivateTag: String?,
private val message: String
private val message: String,
private val privateLevels: Set<String>
) : Module {
override fun invoke(issue: Issue, lastRun: Instant): Either<ModuleError, ModuleResponse> = with(issue) {
Either.fx {
assertNotNull(keepPrivateTag).bind()
assertContainsKeepPrivateTag(comments).bind()
assertIsPublic(securityLevel, project.privateSecurity).bind()
assertIsPublic(securityLevel).bind()

setPrivate()

val markedTime = comments.first(::isKeepPrivateTag).created
val securityChange = changeLog
.lastOrNull { isSecurityChangeToPublic(it, project.privateSecurity) }
val securityChange = changeLog.lastOrNull(::isSecurityChangeToPublic)

val changedTime = securityChange?.created
if (changedTime != null && changedTime.isAfter(markedTime)) {
if (
Expand All @@ -46,16 +47,16 @@ class KeepPrivateModule(
comment.visibilityValue == "staff" &&
(comment.body?.contains(keepPrivateTag!!) ?: false)

private fun isSecurityChangeToPublic(item: ChangeLogItem, privateLevel: String) =
item.field == "security" && item.changedFromString == privateLevel
private fun isSecurityChangeToPublic(item: ChangeLogItem) =
item.field == "security" && privateLevels.contains(item.changedFromString)

private fun assertContainsKeepPrivateTag(comments: List<Comment>) = when {
comments.any(::isKeepPrivateTag) -> Unit.right()
else -> OperationNotNeededModuleResponse.left()
}

private fun assertIsPublic(securityLevel: String?, privateLevel: String) =
if (securityLevel == privateLevel) {
private fun assertIsPublic(securityLevel: String?) =
if (privateLevels.contains(securityLevel)) {
OperationNotNeededModuleResponse.left()
} else {
Unit.right()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@ class InstantModuleRegistry(config: Config) : ModuleRegistry(config) {
Arisa.Modules.KeepPrivate,
KeepPrivateModule(
config[Arisa.Modules.KeepPrivate.tag],
config[Arisa.Modules.KeepPrivate.message]
config[Arisa.Modules.KeepPrivate.message],
config[Arisa.Modules.KeepPrivate.privateLevels]
)
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ private val REMOVE_SECURITY_STAFF = mockChangeLogItem(

class KeepPrivateModuleTest : StringSpec({
"should return OperationNotNeededModuleResponse when keep private tag is null" {
val module = KeepPrivateModule(null, "message")
val module = KeepPrivateModule(null, "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
visibilityType = "group",
Expand All @@ -54,7 +54,7 @@ class KeepPrivateModuleTest : StringSpec({
}

"should return OperationNotNeededModuleResponse when comments are empty" {
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val issue = mockIssue(
changeLog = listOf(REMOVE_SECURITY)
)
Expand All @@ -65,7 +65,7 @@ class KeepPrivateModuleTest : StringSpec({
}

"should return OperationNotNeededModuleResponse when no comment contains private tag" {
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "Hello world!",
visibilityType = "group",
Expand All @@ -82,7 +82,7 @@ class KeepPrivateModuleTest : StringSpec({
}

"should return OperationNotNeededModuleResponse when the comment isn't restricted to staff group" {
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE"
)
Expand All @@ -97,7 +97,7 @@ class KeepPrivateModuleTest : StringSpec({
}

"should return OperationNotNeededModuleResponse when security level is set to private" {
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
visibilityType = "group",
Expand All @@ -117,7 +117,7 @@ class KeepPrivateModuleTest : StringSpec({
var didSetToPrivate = false
var didComment = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
created = RIGHT_NOW.minusSeconds(20),
Expand All @@ -142,7 +142,7 @@ class KeepPrivateModuleTest : StringSpec({
var didSetToPrivate = false
var didComment = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
created = RIGHT_NOW.minusSeconds(20),
Expand All @@ -163,11 +163,33 @@ class KeepPrivateModuleTest : StringSpec({
didComment shouldBe true
}

"should not set to private if bug report is already private but with different security level" {
var didSetToPrivate = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL, "special-private"))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
created = RIGHT_NOW.minusSeconds(20),
visibilityType = "group",
visibilityValue = "staff"
)
val issue = mockIssue(
securityLevel = "special-private",
comments = listOf(comment),
setPrivate = { didSetToPrivate = true; Unit.right() }
)

val result = module(issue, RIGHT_NOW)

result.shouldBeLeft(OperationNotNeededModuleResponse)
didSetToPrivate shouldBe false
}

"should both set to private and comment when security level is not private" {
var didSetToPrivate = false
var didComment = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
created = RIGHT_NOW.minusSeconds(20),
Expand All @@ -193,7 +215,7 @@ class KeepPrivateModuleTest : StringSpec({
var didSetToPrivate = false
var didComment = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
created = RIGHT_NOW.minusSeconds(20),
Expand Down Expand Up @@ -230,7 +252,7 @@ class KeepPrivateModuleTest : StringSpec({
var didSetToPrivate = false
var didComment = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
visibilityType = "group",
Expand All @@ -253,7 +275,7 @@ class KeepPrivateModuleTest : StringSpec({
var didSetToPrivate = false
var didComment = false

val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message")
val module = KeepPrivateModule("MEQS_KEEP_PRIVATE", "message", setOf(PRIVATE_SECURITY_LEVEL))
val comment = mockComment(
body = "MEQS_KEEP_PRIVATE",
created = RIGHT_NOW.minusSeconds(2),
Expand Down

0 comments on commit ffd02af

Please sign in to comment.