Olá, sejam todos muito bem-vindos a mais uma aula. E na aula de hoje a gente vai apenas consolidar o que a gente fez, colocar algumas considerações finais aqui e comentários de pontos em aberto que a gente vai ver nas próximas aulas, não se preocupe. E vamos finalizar, vamos dar um ponto final aqui nas nossas entidades de domínio e nos casos de uso que a gente trabalhou. Então, a primeira coisa que eu gostaria de fazer aqui é separar isso aqui melhor em pastos, tá? O que a gente vai fazer aqui, então? Package, Customer, e aí vamos colocar esses dois caras aqui dentro de Customer. Out Insert, New Package, Partner. E aí vamos colocar esses dois caras aqui dentro de Partner. Agora Out Insert, Package. Vamos colocar aqui Event. Vamos colocar esses três dentro de Event. Out Insert, Ticket. esses três dentro de event alt insert ticket vamos colocar esses dois dentro de ticket e aí sobrou o que sobrou? sobrou esses quatro aqui que são valley objects que pertencem a um uma pessoa física uma pessoa é uma pessoa física e uma pessoa jurídica mas no fim das contas então a gente pode entender que é é person informações de pessoas menos o name ele o name ali está meio genericaço, mas ok. Os casos de uso a gente também no fim a gente pode também separar, customer, e aí coloca esse e esse, a gente pode criar aqui o package de partner, create partner, get partner e a gente pode criar aqui o package event, create event, subscribe customer to event e esse aqui, ele faz sentido estar dentro de Events? Até faz, né? Mas parece ser bastante de Ticket. Mas vamos deixar dentro de Events mesmo, vai. Acho que ele faz bastante sentido estar aqui dentro. Assim como o Ticket aqui poderia estar dentro de events, né, tipo poderia ser dessa forma aí a gente precisa entender a modelagem, né, precisa ver, ddd, a gente já já viu mas vamos deixar assim então dentro de event event tem tickets event event ticket ok acho que tá bom e esses lanços aqui de casos de uso a gente pode mover aqui dentro para casos de uso que vai ser utilizado justamente aqui dentro aí já começa a ficar melhor a brincadeira né aqui a gente também pode criar um package repository colocar esses aqui dentro esse dummy podemos remover use cases a gente também a mesma coisa o customer Package Partner e Package Event, Create Customer como esse aqui, Customer, Event, Event e esse, e aí esses dois aqui para dentro de Partner, beleza. Vamos mudar aqui esses testes para ver se esse refactor não quebrou alguma coisa beleza integration test está quebrando não tem problema mas os outros continuam passando legal show de bola o que eu recomendo também a gente fazer aqui ó vamos aproveitar package domain é interessante a gente testar o nosso domain, certo? Então vamos lá, vamos criar apenas aqui, primeiro vamos fazer, vou colocar as classes aqui, depois a gente, depois a gente coloca em package, tá bom? Então, customer test. Customer test. Vamos lá, deixa eu até pegar aqui, dentro dos casos de uso, a gente até consegue reaproveitar. Não deve cadastrar um cliente com e-mail duplicado, com e-mail duplicado, deve cadastrar um cliente. Copiar, vou até otimizar os auto-importos aqui, que tinha um cara ali. Deve criar um cliente. Copiar, vou até otimizar os auto imports aqui que tinha um cara ali. Deve criar um cliente. Deve instanciar um cliente. Given when, na verdade o when vai ser super simples que é basicamente new customer application e aí passando customer id, customer.newcustomer expected name, expected cpf, expected email, essa é a ordem mesmo, name, cpf, email, é a actual customer, customer, customer id, ponto valley, ponto valley, ponto valley, beleza. .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .valley .v o CPF é justamente vai quebrar aqui no escopo bem menor do que não teste grande né um teste mais brother é não deve instanciar um cliente com CPF e válido e lembrando que a validez do CPF aqui não tá daquelas né test create customer with invalid CPF eu vou tirar um ponto aqui ó e aí o, opa, e isso aqui. A gente até pode quebrar aqui a linha, só pra ficar mais legível, ActualError, e aí aqui, ExpectedError, e a gente pode colocar, só pra deixar mais enxuto, pode colocar tudo aqui já direto. Só vou deixar o CPF fora, porque o CPF é o que a gente está passando de valor inválido. é o que a gente está passando de valor inválido. Isso aqui vai para a vala, isso aqui vai para a vala, expectedError e é igual a actualError.message. Na verdade, eu vou passar tudo errado aqui, só para não ficar confuso. Não deve instanciar um cliente com cpf inválido e a mensagem que deve vir é justamente essa aqui. Beleza, não deve instanciar um cliente com nome inválido, isso em vez de name. A diferença agora é que eu vou passar nulo para name aqui. E aqui a gente põe o ponto de novo, invalid value for name, e aí vamos copiar isso aqui de novo e vamos colocar não devem sancionar um cliente com email inválido. Então, sei lá, acho que se a gente colocar só isso aqui já funciona, vamos ver. Invert value for e-mail. E aqui, John Doe. Vamos lá, vamos mudar todos os testes para ver. Todos os testes passaram corretamente. Show de bola. Agora o que eu eu fazer vou duplicar isso aqui e partner não deve instanciar o que é cliente vai virar partner né partner o que é customer vira partner partner é só que vamos trazer o importe correto a diferença do partner é que ele é justamente um cnpj então vamos copiar aqui é um cnpj onde tiver cpf colocar aqui cnpj name cnpj, name cnpj, email, beleza, partner id cnpj, não deve instanciar um partner com cpf, esse aqui é cnpj invalid cnpj bom, de certa forma isso aqui é um cnpj inválido não deve instanciar um partner com um nome inválido invalid name, name, papapá agora aqui a gente só precisa de um cnpj válido cnpj válido e não deve queira com o e-mail inválido. Então precisamos de um que... Beleza, vamos mudar todos os testes para ver se não come bola. Não come bola. Então já testamos duas entidades. Como o teste já fica bem mais efetivo. E aí a gente até já pode colocar em pacotes né customer package partner então o customer vai pra lá, o partner vem pra cá agora a gente pode criar o package do event e aqui dentro a gente pode colocar o evento test. Opa, coloquei no lugar errado. Beleza, vamos lá, o que o event tem? O event tem bastante coisa. Name, date, total partner. Ok. Use case, event, test, create event vamos pegar isso aqui vamos colocar aqui deve criar o evento test, create event tem um partner, expected date beleza, isso aqui não vai ter vai ser só mais fácil mesmo também não vai ter event.newEvent expected date total spots e partner opa beleza beleza date ponto ah tá se a gente formatar aqui ponto to string .chostring .datetimeformatter .name .totalspots e o assert equals expected tickets igual a zero expected tickets actual all tickets ponto size e esse aqui é event id tem alguma coisa que estou esquecendo vamos ver não é isso mesmo ele está reclamando aqui maybe final tickets, tickets, use tickets, add ok então vou dar esse testezinho o testezinho passou a gente pode colocar agora não não deve criar um evento com uma com nome inválido data total spots partner também não haver argumento com nome inválido test client with invalid name então a diferença aqui é, vamos só copiar isso aqui, isso aqui a gente vai copiar na carudonao mesmo tá tudo bem expect de r isso aqui total spots 10 expected error papapá cadê fetch name new name invalid value for nem então é isso aqui ó rodar beleza vamos lá vamos lá falta pouco não deve criar um evento com data com data com data inválida com invalid date invalid date for event e a diferença é colocar aqui um formato ruim disney, opa, date time format exception, perfeito né, porque realmente não é esse, na verdade, invalid date, olha como a gente pega alguns alguns erros o ideal é que a gente anda tratando aqui no site de jovem vale a mesma coisa que a gente pode colocar num catch runtime exception e aí throw new invalid com a referência né vamos fazer o for da referência fecha esse event agora sim a gente roda beleza vamos para o próximo vamos para o próximo. Vamos para o próximo. Agora, vamos fazer o seguinte, ó. Pra não ficar, né. Acho que deu pra entender já que a gente deve validar todos os... Tudo, né, que pode falhar. A gente tem que ter um testezinho pra ele. Então, acho que é legal você fazer esse teste. Mas vamos testar junto aqui o que importa, ó. Reserve Ticket. Então acho que é legal você fazer esse teste. Mas vamos testar junto aqui o que importa. Reserve ticket. Reserve ticket é um super método que a gente deve testar. Então deve reservar um ticket quando é possível. é possível teste reserve ticket reserve ticket legal, então vamos fazer o seguinte, vamos copiar isso aqui quer dizer, vamos copiar isso aqui mesmo e aí a gente coloca o nome diz nem na verdade o mais seguro ainda copia tudo aqui traz pra cá beleza esse when sai fora agora a gente tem aqui então actual event expected ticket vai ser 1 aqui o que a gente vai fazer event.reserved ticket para um customer então a gente precisa trazer um customer aqui deixa eu ir lá no customer test e precisa trazer um Customer aqui, deixa eu ir lá no CustomerTest e vamos trazer um Customer. Então, FinalVar e Customer igual, vamos trazer este Customer, a única diferença é que o CPF está inválido, a gente só corrige isso aqui. Customer.id finalvar actual ticket agora a gente vai fazer as verificações aqui então ó opa acho que eu não copiei as verificações vamos trazer aqui depois de chamar esse método o id do evento continua não sendo nulo isso aqui está certo, está certo, está certo tickets agora deve ter um o partner deve continuar o mesmo beleza, agora a gente deve comparar o ticket né assert vamos ver aqui, assert not null ticket ponto ticket id assert equals assert not null ticket.ticketid assert equals equals event actual event .eventid ticket.eventid assert equals a customer .customerId actual ticket customerId e assert equals expected ticketOrder que deve ser 1 Então, customer não paga isso aqui. Ticket order, ticket or actual ticket. O ticket não tem order, cacete. Quem tem order é o actual event.get ticket. Vamos lá. . all tickets. . iterator..next Calma que a gente vai verificar isso aqui também. Esse método é bem rico de verificações. assert equals expectedTicketSize Aqui no ticketSize a gente já está verificando que ele tem 1 então a gente pode pegar final var actual event ticket aqui porque a gente sabe que ele tem 1 então eu estou pegando este 1 e a gente pode usar esse cara para justamente verificar isso aqui ponto ordering igual aquela ordering que a gente falou a gente tem que verificar isso aqui ó. .ordering igual aquela ordem que a gente falou. A gente tem que verificar isso aqui também. Ó, isso aqui. Event, customer, e tinha mais um, tem customer, ordering, ticket, event, ah, e o ticket, cadê ó, ticket, actual ticket, ponto ticket id, ticket id, e aí esse cara vamos trazer aqui pra cima na verdade ó primeiro a gente vai verificar o ticket actual event id event id beleza ah inclusive esse cara só pra ficar mais legível ó final var expected event id porque a gente tá usando tanto ele né então vamos substituir aqui ó event id tudo que tiver actual event.eventid a gente já substitui esse aqui não faz sentido beleza e aqui o que veio de lambuja não tem a mesma coisa o customer .id. Aqui, cadê? Esses dois. Beleza. E o actual ticket.ticketid, de fato tem que ser Ok, e agora aqui, o ticket dá para ter algumas verificações. Então, status, quando cria um ticket, a gente espera, por exemplo, final var expected ticket status igual a ticket status ponto paging assert not null para o reserved at assert null para o paid at beleza olha quanto a verificação passou bonito verificamos tudo né de um método de reservar o ticket que é quase que o teste contemplado daquele use case perfeito o caso de uso de subscribe aqui a gente já garante o grosso lá a gente garante que a gente está por exemplo chamando e persistindo de fato é esses agregados essa é a principal diferença lá a gente testa que foi persistido com o valor correto aqui a gente testa que o método de fato funciona como a gente quer e aí a gente pode fazer aqueles outros testes teste cenário infeliz não deve reservar um ticket quando já quando o evento está esgotado test reserved ticket when event is sold out ou seja, expectedOtherSpots, 1, aqui event, reserveTicket, e aí ao tentar fazer um reserveTicket de novo, para o mesmo customer ele já vai dar pau, porque ele vai primeiro fazer a checagem, depois ele verifica se o customer é diferente. Vamos só criar um novo customer, aqui, um customer2, só para dar uma diferença, um a diferença 111.john1.john1 então o segundo foi tentar comprar ele vai tomar um assertions.assertTruth validationError quando for linta é actualError e acert equals actionError.getMessage expected error o resto vala isso aqui tudo vala agora a gente limpa tudo isso aqui que é vala também o expected error tudo isso aqui que é vala também o expecto de erro e vende sold out a gente reservou o ticket uma vez aqui e na hora de tentar reservar novamente quando o ticket só tem um e vai dar erro esses caras aqui, date, esse aqui, tudo, vala. E esse aqui vem pra cima. Beleza, só deixa eu ver se a mensagem é essa mesmo, event sold out. Olha aí, olha que eu errei ali, primeiro ele verifica se o cliente é mesmo aquele. Então vamos fazer já esse teste também. Teste não deve reservar um ticket quando o... Não deve reservar dois tickets para um mesmo cliente. Teste reserve ticket for the same client. Teste reserve 2 tickets for the same client. Então aqui, o Customer 2 vai para a vala. E aí a mensagem que tem é Email already registered. Que mensagem ruim, hein? Mas ok. Vamos rodar. Todos passaram. Olha a segurança que a gente tem, né? Tem alguma outra verificação? Não, não tem mais nada. 27 minutinhos de aula. Opa, coisa aqui é agora o que o que pode ser feito né teste da instanciação de um ticket eu acho que a gente pode testar apesar de já já ter testado né já ter testado o ticket, vamos fazer junto aqui, só o feliz, só o feliz aqui, create test, ticket test, beleza, eu vou até pegar do evento deve criar um chip que a gente precisa mesmo deixa eu só ver aqui ó ticket.newTicketCustomer e o id de evento. Então, customer e um evento. FinalVarAnEvent. Igual a isso aqui. Data. Name. Death. Isso aqui, ó. Vala. Isso aqui vai lá pra baixo. dev isso aqui ó, vala isso aqui vai lá pra baixo isso aqui é vala ticket new ticket a customer.customerid an event.eventid actual ticket opa, acho que eu paguei coisa demais para ele a isso aqui a univente e esse aqui beleza e é isso aqui, ó, vala então, caminhozinho feliz instanciando um ticket também coberto agora eu deixo pra vocês fazerem os cenários infelizes né, garantir que a cobertura realmente tá tá excelente ah, e também é interessante fazer teste pra cada um desses aqui ó para cada um desses person vamos fazer só um vamos fazer junto aqui ó eu vou vir aqui ó cnpj create test cnpj test deixa eu copiar aqui ó o do, porque o do customer a gente já tem deve com cpf ah, é cnpj pegar do partner organizar auto import tem um import ruim ali não deve instanciar um cnpj inválido teste, create cnpj inválido, test create cnpj with invalid value, invalid value for cnpj, new cnpj, passando o valor ali. Vamos rodar o nosso teste. Beleza. Agora só, cenáriozinho feliz. Deve instanciar vamos pegar um cnpj válido ali expected cnpj aqui ccnpj null-wifi, null-valid, também é verificado. Beleza, vamos dar oidações mais reboscadas. Tudo que tiver CNPJ aqui a gente muda pra CPF. Esse aqui, CPF. E aí a diferença agora é que a gente precisa passar um CPpf-vive aqui, que é basicamente isso aqui. Opa, só rola um. Show de bola. Então é isso. Teste de cnpj e cpf feito. Cadê? Ah, falta o do e-mail, né? O do e-mail também dá pra fazer no mesmo esquema, ó. E-mail test. Tudo que for CPF a gente renomeia pra e-mail. Tudo que for CPF assim, ó. E-mail. E aí a diferença é que a gente vai colocar aqui um, ó. John, arroba gmail.com, aqui o inválido, John, Josh, arroba S e aqui nulo. É isso. Então, cobertura em cima do domen, todos muito garantidos, estamos muito felizes e muito seguros agora. Espero que vocês tenham gostado, vejo vocês na próxima aula.