Hace mucho que no programo en java o algo parecido, últimamente hago mucho groovy y estoy aprendiendo clojure, pero bueno, revisando código en el trabajo me topé con una estructura switch, y de inmediato llamo mi atención:
List<Role> findInviteRoles() {
List roles = []
def authorities = springSecurityService.getAuthentication().authorities
authorities.each {role ->
switch (role){
case 'ROLE_ROOT':
roles += ['ROLE_ROOT', 'ROLE_ADMIN']
break
case 'ROLE_ADMIN':
roles += ['ROLE_ADMIN']
break
case 'ROLE_1':
roles += ['ROLE_2']
break
}
}
Role.where {
authority in roles.unique()
}.list()
}
A lo cual me pareció que el switch iba sobrado y decidimos hacer un refactor. Se puede ver que ahora están separados los datos de la lógica, lo cuál en algunos casos facilita la mantenibilidad del código.
List<Role> findInviteRoles() {
List roles = []
def permisos = ['ROLE_ROOT':['ROLE_ROOT', 'ROLE_ADMIN'],
'ROLE_ADMIN':['ROLE_ADMIN'],
'ROLE_1':['ROLE_2']]
def authorities = springSecurityService.getAuthentication().authorities
roles = authorities.collect {
permisos."${it}"
}.flatten().unique()
Role.where {
authority in roles
}.list()
}
A mi punto de vista queda más limpio y claro el objetivo del
collect que del switch. Dejo la prueba unitaria.
@Unroll
def "test list granted invite roles with #userRole and result #listResult"() {
setup: "mockering"
SpringSecurityService.metaClass.getAuthentication = { [authorities: [userRole]] }
def springSecurityService = Mock(SpringSecurityService)
service.springSecurityService = springSecurityService
systemRoles.each {
def role = new Role(authority: it)
role.save validate: false
}
when:
def list = service.findInviteRoles()
then:
list?.authority == listResult
where:
userRole | systemRoles || listResult
'ROLE_ROOT' | ['ROLE_ADMIN', 'ROLE_ROOT', 'ROLE_GARBAGE'] || ['ROLE_ROOT', 'ROLE_ADMIN']
'ROLE_ADMIN' | ['ROLE_ADMIN', 'ROLE_ROOT', 'ROLE_GARBAGE'] || ['ROLE_ADMIN']
'ROLE_1' | ['ROLE_ADMIN', 'ROLE_ROOT', 'ROLE_GARBAGE', 'ROLE_2'] || ['ROLE_2']
'ROLE_2' | ['ROLE_ADMIN', 'ROLE_ROOT', 'ROLE_GARBAGE', 'ROLE_2'] || []
}
No hay comentarios.:
Publicar un comentario