@startuml
skinparam defaultFontSize 16

skinparam sequence {
   ArrowColor blue
   LifeLineBorderColor blue
   ParticipantBorderColor blue
   ParticipantBackgroundColor transparent
   ParticipantFontSize 16
   ActorFontColor blue
   ActorFontSize 15
   ActorFontName blue }
hide footbox

title US007 - Como responsável do grupo, quero criar uma conta do grupo, atribuindo-lhe uma denominação e uma descrição, para posteriormente poder ser usada nos movimentos do grupo.

autonumber

participant ":Test" as test
participant  ":CreateAccountForGroupController" as controller
participant "createAccountService: \nCreateAccountForGroupService" as service
participant "groupRepo\n:GroupRepository" as groupRepo
participant "account\n:Account" as account
participant "accountRepo \n:AccountRepository" as accountRepo
participant ":CreateAccountForGroupAssembler" as Assembler
participant "requestDTO: \nCreateAccountForGroupRequestDTO" as requestDTO
participant "createAccount\nForGroupDTO:\nGroupDTO" as GDTO
participant "groupID:\nGroupID" as groupID
participant "group\n:Group" as group
participant "accountID\n:AccountID" as IDaccount
participant ":AccountsIDs" as accountsIDs

activate test
test -> groupRepo *: ()
test -> accountRepo *: ()
test -> service *: (groupRepo, accountRepo)
test -> controller *: (createAccountService)


==ACT==

test -> controller : createAccountForGroup ("accountID",\n "groupID", "denomination",\n "description")
activate controller
controller -> Assembler : mapToRequestDTO ("accountID",\n "groupID", "denomination",\n "description")
activate Assembler
Assembler -> requestDTO * : ("accountID","groupID", \n "denomination", "description")
Assembler --> controller : requestDTO
deactivate Assembler
controller -> service : createAccountForGroup\n (requestDTO)
service -> requestDTO : "groupID" = getGroupID ()
service -> groupID* : (Long.parseLong("groupID"))

service -> groupRepo : validation1 = containsByID (groupID)

opt validation1 == true

service -> groupRepo : group = findByID (groupID)
service -> requestDTO : "accountID" = getAccountID ()

service -> IDaccount *: (Long.parseLong("accountID"))
service -> accountRepo : validation2 = containsByID (accountID)
service -> group : validation3 = hasAccountID (accountID)


opt validation2 == false && validation3 == false


service -> requestDTO : "denomination" = getDenomination ()
service -> requestDTO : "description" = getDescription ()
service -> account*: (accountID, "denomination" , "description")
service -> accountRepo : add (account)
service -> accountsIDs : result = addAccount (accountID)

service -> Assembler : mapToDTO(group)
Assembler -> GDTO* : ()
Assembler --> service : createAccountForGroupDTO
end
end
service --> controller : createAccountForGroupDTO
controller --> test : createAccountForGroupDTO

==ASSERT==
test -> test : assertEquals (expected, createAccountForGroupDTO)



@enduml