Olá pessoas boas-vindas a mais uma live de Python eu sou o dinossauro e espero que vocês estejam bem Aquele feedback assim para mim pra gente ver se tá o áudio funcionando o vídeo tá funcionando me mandem aí um tá tudo certo tá tudo ok E aí a gente começa bom enquanto isso eu vou apresentando o que a gente vai falar hoje a gente vai conversar sobre o gerenciamento de tarefas né a gente vai desenvolver um Tod list com fash api hoje usando todos aqueles conceitos que a gente já trouxe né gerenciamento de usuários token jwt
e Todas aquelas coisas a ideia da aula de hoje é a gente fazer tipo uma união de todos os conceitos Então a gente vai usar o p test Factory Boy routers tipo tudo que a gente já viu até agora vai ser acumulado nessa aula então eu queria dizer uma coisa pode ser que essa aula fique comprida demais dependendo das perguntas da forma como a gente foi interagindo mas eu vou prezar a nossa Interação em relação a isso tipo assim em relação a gente terminar a aula ou não qualquer coisa a gente quebra essa aula onde
a gente terminar aqui volta na quinta-feira e continua discutindo esse tópico porque eu sei que ele vai ser um pouco mais complexo um pouco mais difícil então A ideia é essa tipo assim vamos trocando ideia vamos conversando E se alguém engasgar em alguma parte eu vou tentando conversar a gente vai discutindo e ver o que que acontece pode ser combinado assim porque eu não queria ir com pressa nessa aula porque ela tem muitas coisas espero que vocês vocês me deem um joinha fala assim ó beleza combinado Lembrando que essa aula tem um a aula em
texto também então para quem preferir dá dá uma lida para quem quiser pegar algumas referências e tudo mais tudo que a gente tá falando tá aqui eu eu me dei uma licença poética para desenvolver essa aula no vídeo um pouco diferente do que a gente fez no texto porque eu acho que ela merece um pouco mais de carinho Então vamos indo devagarzinho bom que que a gente vai fazer nessa aula de fato a gente vai criar rotas para fazer um crude a gente já tinha feito alguns outros crudes eu vou falando enquanto eu vou tirando
a blusa aqui tá me dando calor aqui falar então a gente vai fazer um outro crude né dessa vez não de users né Igual a gente fez da outra vez a gente vai usar aquelas coisas de users que a gente fez e tudo mais só que com gerenciamento de tarefas e tarefas pertencem a pessoas né e eu não sei me respondam aí no chat vocês já lidaram com algum to list alguma vez na vida isso é importante e obviamente a gente vai fazer testes e integrando vai ter banco de dados vai ter algumas coisas então
queria saber de vocês aí vocês sabem o que é um Tod list nem nem é todo mundo que é muito acostumado com esse conceito aqui então eu deixei um to list que eu fiz há muito tempo no curso de selenio aqui para vocês entenderem como é que isso aqui funciona basicamente imagina que eu tenho algumas tarefas que eu preciso realizar no futuro né então beleza ah eu preciso ligar para minha mãe ligar para minha mãe aí beleza Ah eu preciso ligar paraa minha mãe aí eu preciso falar com ela tipo assim sei lá você esqueceu
de dar comid lembrar de dar comida ao sei lá cachorro do vizinho Então a gente tem esse tipo de coisa aqui dentro né então Aí você coloca numa fila de tarefas Então eu tenho isso aqui para fazer eu tenho outra tarefa que é dormir por exemplo não vou colocar nenhuma descrição e a gente vai fazendo Ah isso aqui eu botei para fazer então isso que eu tô fazendo agora eu coloquei aqui no pronto e aí eu tenho uma outra tarefa sei lá blá blá blá E aí eu tenho uma outra a fazer essas tarefas podem
mudar né Elas vão pra frente vão para trás então a ideia de um tudo list é basicamente isso aí aqui eu coloquei um senso de urgência que fazia sentido na época e tudo mais aí aí alguém mandou seria como um trelo sim qualquer ferramenta desse desse sentido como se fosse um trelo como se fosse um um o github né que tem um board que faz esse tipo de coisa então isso serve para todos esses pontos A ideia é que a gente vai desenvolver isso aqui no backend né não tem tela né mas Luiz obrigado por
se tornar membro e eu vou agradecer também o Carlos Carlos Valeu pelo super chat Tamo junto aí então A ideia é a gente vai vai fazer isso aqui criar esse gerenciador aqui obviamente no backend e a gente tem que lembrar só do que é esse esquema né eu eu resolvi mostrar porque às vezes eu acho que não é todo mundo que tem uma familiaridade com esse tipo de coisa né O que a gente tinha feito antes login logout essa essa parada tipo todo mundo meio que já viu né Então aí a gente vai fazer isso
aqui no backend pra gente poder contemplar uma tela que seria assim a gente não vai fazer a tela mas vocês podem fazer a tela a partir da api que a gente vai desenvolver aqui então basicamente isso é um tud list E aí como é que isso aqui vai funcionar dentro da nossa aplicação né eu preciso que eu tenho um todo que é meu né tipo ah as minhas tarefas não podem ser vistas pelo pelo pluts que tá aqui que o Carlos não pode ver as tarefas de uma pessoa para outra então A ideia é meio
que a gente consiga isolar né porque a gente já tem o gerenciamento de usuários então a gente cria o nosso token vai lá e cadastra nossas próprias tarefas depois a gente lista as nossas tarefas e depois a gente vai fazendo esse tipo de coisa então é isso que a gente vai desenvolver nessa aula e lembrando se não der tempo da gente terminar agora a gente estende para quinta-feira e continua fazendo isso aqui vai fazendo junto não tem problema então legal o que que a gente precisa fazer para isso tudo na nossa aplicação a gente fez
um refactor para ficar mais fácil né de colocar isso aqui a gente vai criar um novo router né um roteador Zinho do fash API e vai unir todas essas rotas lá então como é um crude a gente tem que poder criar tarefas Lar tarefas alterar tarefas deletar tarefas então tarefas normais só que para isso a gente precisa ter uma tabela nova no banco de dados essa tabela precisa se associar com quem é o dono das tarefas né a pessoa que detém os todos então para isso vamos ter que fazer novos esquemas novos end points novos
testes Então hoje é a hora de colocar tudo em prática Então vamos lá bom o primeiro endp que eu quero criar com vocês é o endp onde a gente cria as tarefas né porque não faz muito sentio né eu vou listar se eu não tenho nenhuma sabe E aí Ness nessa primeira parte eu quero fazer tudo com vocês então a gente vai ter que fazer um esima o router o endp a tabela do banco de dados todas essas outras partes Então vamos trocando ideia vamos conversando conforme for necessário aqui bom a primeira coisa que eu
quero fazer aqui eu quero criar esse Fast zero HS to do acho que a câmera tá na frente mas é só um todo. py aqui e aí a gente vai começar a a brincar com isso aqui né então vamos lá dentro do nosso aplicativo a gente já tem né os dois routers né o de alp e de users a gente vai criar um que eu vou chamar de todos to do é a fazer né para fazer né para quem precisa desse input do inglês aí é tipo assim tarefas a fazer sabe é um Tod list
lista de tarefas que eu tenho para fazer então vamos lá to do.py legal aí daqui a gente vai fazer aquele lance que a gente fez nos outros roteadores né então from Fast api Import ah router então é api router E aí a partir desse router a gente vai simplesmente criar aqui né aquela coisinha que a gente já tinha feito então vai ter um prefixo esse prefixo são os todos e a tag para ficar mais organizado na documentação vai ser essa parte dos todos masa vai ficar um bloquinho lá e para isso aqui funcionar né para
ele Prof IPI reconhecer isso aqui a gente tem que juntar né esse router na API tradicional que é aqui onde tá o nosso app então basicamente a gente tem aqui né o Import off users a gente importa o todo e aí a gente vem aqui e inclui esse router aqui né então todo. router basicamente é só isso aqui que a gente precisa fazer ele vai reclamar porque não tá em ordem alfabética né porque o t vem antes então se a gente for rodar já os testes a gente vai ver isso aqui né então Task testes
ah é eu tenho que ativar o poit né então poit Shell Task Test Test no singular ele falou ah beleza tem uma coisa aqui não tá bem formatado então Task Format aí ele me deu alguns erros aqui de um Security Ah beleza isso aqui é um arquivo que o meu editor deixou aqui por algum motivo né É bom que essas coisas aconteçam porque esses erros são Inter isso aqui aqui ó ficou esse Security aqui um um arquivo sei lá devo ter aberto em algum momento e nunca fechei isso aqui então vou remover ele deu erro
nesse arquivo tem uma outra coisa aqui não sei por beleza Format aí ele tem algum expect Security linha 73 eu não lembro de ter deixado nenhum erro aqui mas tem um elce em algum lugar que não tem dois pontos na linha 73 73 rying ELS found dois pontos expected else found dois pontos Nossa eu não entendi esse erro aqui do do Roof não e999 ele espera um ELS bom é um erro novo do ruff eu vou dar um Nok Way aqui e ele não vai deixar né então eu vou vou ter que deixar um um
uma notificação do ruof aqui interessante interessante legal esse erro aqui né tipo assim agora porque eu eu fico atualizando sempre o repositório né agora ele deu um e 9999 ele tá falando que tá esperando um ELS nessa parada Mas eu acho que não eu acho que é tipo assim tem algum erro aqui ó pode Ah eu entendi o que foi nos exemplos a gente tava fazendo algumas coisas bizarras aqui né no fim da aula e eu acabei deixando isso aqui é agora me lembrei por que isso tava aqui ó Task Format Agora sim isso foi
um exemplo que a gente rodou na aula lembra tipo assim ah vamos brincar aqui como é que eu faria um usuário administrador alguém perguntou isso no fim da aula passada e ficou aqui beleza perdão por isso vamos dar um Task teste agora e ver o que que acontece a gente vai ver que essa parte inteira vai est coberta é legal esses erros essa parte da Live para mim é o mais legal porque a gente vê os erros acontecendo né Legal rodou todos os testes passaram não tem nada de especial aqui né Firefox developer Edition HTML
index legal tá aqui se a gente for olhar o nosso todo aqui né tudo Tá passando Tá tudo funcionando aqui tudo testado em teoria né porque a gente não desenvolveu nada até então mas eu quero subir o servidor daqui pra gente olhar como é que isso aqui ficou lá na documentação Então vamos lá ah Task Brum então local host 8000 bar doc ó ele não criou nada porque não tem nenhum endp né mas aquela tag vai fazer com que a gente gere um to do aqui né a mais legal massa tá passando testado porque não
tem teste nenhum né Beleza começamos a desenvolver essa parte de fazer né o roteador o roteador está pronto da forma como a gente fazia antes e tá massa agora a gente vai criar nosso primeiro endp aqui para dentro dessa aula aqui né tipo assim então o que que a gente precisa eu preciso poder cadastrar tarefas a fazer né então vamos lá deixa eu aumentar um pouco a fonte aqui então a gente tem o @h pon get a gente vai botar o barra né porque não é get né é post aqui post E aí a gente
não tem o response Model ainda e Esso aqui pode ser um Create to do aqui né Create to tomass a gente tem o nosso primeiro end Point aqui só que beleza a gente vai ter que receber o o jeon Né o jeon Adoro falar jeon a gente vai ter que trazer o Jason para cá e ele vai ter que ter algumas características né então a gente tem um json que eu vou chamar de Tod esima ele ainda não tá implementado obviamente a gente vai fazer isso aqui e a gente tem o response Model que a
gente também não implementou ainda né que ele pode ser um to do Public alguma coisa nesse sentido aqui então eu pensei mais ou menos nisso aqui pra gente poder enviar as tarefas são basicamente aqueles Campos que a gente tinha aqui quando a gente estava olhando lá no na web né então aqui no t list então por exemplo a gente tem o nome da tarefa a gente tem a descrição da tarefa aí a gente cria tarefa e ela tá em algum lugar né a fazer ela tá no fazendo ou ela tá no pronto eu comecei a
pensar em alguns nomes pra gente deixar aqui né Então vamos pensar aqui eu pensei que ele pode estar em draft Sei lá uma coisa tipo assim eu ainda não terminei de escrever essa tarefa ela pode estar em né a fazer ela pode est sendo feita nesse exato momento que é o doing ela pode est pronta que é o done e ela pode estar na lixeira sei lá descartado Ah eu não quero isso aqui mas a gente não exclui deixa lá por um tempo pode ser alguma filosofia disso então basicamente o nosso esquema ele tem isso
aqui né ele tem um título que é o nome da tarefa que eu quero fazer a descrição dela que é o que vai ter que ser feita aqui e e a gente tem o estado que é como essa tarefa está dentro do banco de dados ou seja ela tá sendo escrita ela tá em to do do em tá na lixeira Aonde isso aqui tá E na resposta aqui a gente vai usar o mesmo esquema né o Tod esquema e só vai adicionar o ID para ele né para ele ser colocado para fora quando iniciar uma
nova já inicia como draft então poderia ser né tipo assim no Fronte você tá escrevendo lá e ele envia e salva como draft pode ser uma forma de resolver esse problema né tipo ah se alguém fechar o aplicativo no meio sei lá mobile Você fecha o aplicativo no meio e aí pelo menos ele salvou em algum lugar sabe poderia ser esse tipo de coisa então por isso eu pensei em deixar o draft aqui e a lixeira também porque às vezes você exclui uma tarefa Mas aí você fala Putz poderia ter usado essa tarefa né Tipo
depois ou tipo assim pô Excluir sem querer sabe Essas coisas acontecem no dia a dia né então para isso a gente vai criar esses esqueminhas aqui esses dois esquemas então to do esema e o to do Public Então vou até colocar aqui to do Public e a gente vai ter que ir lá na nossa pastinha de esquemas né aqui e criar esses dois legal então a gente tem o Tod skima que tem o título a descrição e ele tem esse estado esse estado aqui é uma classe especial do Python que é essa classez inha que
a gente chama de enum enum quer dizer que isso aqui é enumerado sabe então beleza em teoria isso aqui funcionaria com números né Mas a gente pode usar com Strings também então a gente classifica olha os tipos possíveis que a gente tem são esses aqui dentro da classe Tod a gente tem o draft to do o doing o done e o Trash e aqui dentro a gente tem o draft o então esses nomes são os que a gente vai usar né quando a gente for receber esses dados de lá de dentro Então basicamente o state
aqui que a gente vai chamar no state ele pode ter esses estados possíveis sabe a gente não pode colocar um estado Indefinido aqui então são um desses cinco ele tem que tá em um desses cinco não dá para ter uma coisa diferente sabe então é esse esquema faz sentido aqui eu não entendi o models essa classe determina as colunas da tabela então isso aqui determina os tipos que podem tá aqui né tipo assim só pode ser um desses cinco se não for um desses cinco tá errado então isso aqui é um legal porque você pode
pedir perguntar pro back Ah mas aí quais que são os tipos que eu posso mandar E aí no Fronte fica aquele select Box draft to do tal tipo assim todo esse esquema então legal isso aqui a gente vai criar lá no Models Por que no models e não na pasta de esimas vocês vão entender daqui um minuto Quando a gente chegar lá então legal aqui eu vou colocar aqui no começo né antes de das tabelas a gente vai falar olha tem esse N1 aqui do Python e basicamente isso aqui tem esses estados massa aí o
J vcs disse aqui né o Ti do state retorna uma lista fixa né então só podem ser um desses C estados não dá para ter um tipo Amanhã eu resolvo ou tá emu ou tá em Don Trash ou ou draft legal então eu vou importar ele para cá né então vamos lá ah from Fest z0 models Import Tod state E aí agora a gente tem esse estadinho do Tod eu quero mostrar para vocês como é que isso aqui vai ficar lá na api massa ah preciso importar também na pi né os os toos aqui que
eu não importei né então from Fest z0 ponto ahonde eu coloquei isso aqui no skim Import to do Public e to do esima Massa agora a gente tem esses dados aqui para poder usar vou rodar aqui de novo subiu e eu quero mostrar como isso aqui se manifesta lá no end Point porque essa é a coisa legal aqui então vou dar um F5 agora a gente tem o users o a gente tem o to do aqui e olha que massa o estado que ele já cria por padrão é o primeiro state draft olha que massa
Então a gente vai ter que enviar para ele no no Jason o título a descrição ou o estado massa e aqui embaixo se a gente for ver o to do skima Olha que interessante ele já dá na documentação pra gente os estados que são possíveis olha que massa Então quais são os valores permitidos pro Estados Então a gente tem o draft o to do o doing o done e o Trash se a gente mandar qualquer um desses valores diferente disso ele vai dar 422 porque deu um erro não é a mensagem que a gente queria
se lá aí ele deu Aqui ó 422 E na resposta fala tipo assim ó input Should Be ou seja o input deveria ser draft to do doing done ou trash massa fez seno US do então tio desses Vales você não passar um valor que não é nenhum desses definidos a gente Costa dier ISO nos tipos que literais precisa literalmente ser um desses tipos Então essa é a função do N1 aqui massa Então a partir disso aqui pô a gente já tem um end Point se a gente mandar sei lá um draft aqui beleza mandou deu
internal server error Por que que deu interno a server error porque a gente não retorna nada né eles queria retornasse um to do Public e a gente não retorna absolutamente nada mas beleza dentro da nossa colocação do nosso mundo é é isso aqui que tem que acontecer né até porque a gente não implementou nada ainda de dentro do endpoint Só que nesse endpoint eu quero várias outras coisas também então eu preciso saber quem é o user que detém essa tarefa né que é o corrent user que a gente desenvolveu nas aulas passadas Eu preciso da
session do banco de dados porque a gente vai usar a session aqui né porque eu preciso persistir isso aqui no banco de dados Então vamos voltar lá a gente tem esse to do que a gente queria a gente vai precisar da session e quem mais que eu coloquei aqui o user então session vai receber um tipo que a gente ainda não sabe e o user que é um tipo que a gente ainda não tem conhecimento aqui dentro desse esquema como é que a gente vai fazer então a gente vai ter que importar as coisas das
da nossa própria biblioteca né coisinhas que a gente já fez né então como a gentea s a vai ter que ir l então from Database Import get s a gente vai montar o objeto session então S vai fazer o vai usar o depend aquele tipo anot do P typing Então vamos L typing Import S do banco de dados então que vai depender de get session então depends opa não é daqui é do fash API depends Então a gente vai colocar a dependência do get session que a gente precisa da session e a gente precisa do
tipo session né que aqui a gente vai receber session que vem do próprio skl alkemy né então vamos lá from skl alkemy P ORM Import session massa então a gente acabou de montar esse objeto session que a gente precisava que a foi o que a gente fez com tesão na outra aula legal agora temos o session aqui e a gente precisa do que mais a gente precisa do user então o user é aquele mesmo esquema user vai ser um annotated de de quem do tipo user do nosso modelo né então from f zer f0 P
models Import user então ele vai ser um user e esse user é o qu depende da nossa função de segurança que valida quem que tava aqui né então é o depends do get current user que tá lá no nosso Security então from f0 Security Import get user E aí a gente vai usar esse user aqui a partir disso quer dizer que a gente só pode usar isso aqui se a gente tiver logado né Então você só pode criar novas tarefas se tiver logado vamos vamos fazer o seguinte aqui vamos rodar o o r ver o
que que ele fala pra gente aqui então Task Format Task link beleza tudo funcionando Task rum beleza subiu tudo rodando bonitinho se a gente for lá agora essa rota agora ela vai est bloqueada né ela vai ter um cadeado aqui na frente né Deixa eu dar um F5 Pronto agora a gente precisa estar logado para fazer esse tipo de coisa então você pode dar um trite out executar aí ele vai falar ó detail not authenticated porque a gente não fez o rolê do login massa em teoria tá tudo certo tudo funciona tudo bonitinho tudo lindo
agora a gente tem o banco de dados aqui que a gente pode usar para ver se se tem a session como é que as coisas funcionam Mas a gente não tem o a tabela no banco de dados né Tipo se a gente já quiser usar você pode dar um return to do aqui né return to do então a gente cadastra o user usa ele e ele funciona né tipo assim vamos lá então beleza ah a aplicação já tava no Hot Reload aqui então se a gente criar um user fizer o login aqui em teoria tudo
tem que funcionar ele vai retornar uma coisa pra gente será vamos ver o que que acontece Então vou criar um user na nossa aplicação então é string sem string legal interno server error ele reclamou que eu não tenho a tabela criada porque eu deletei o banco de dados Então vamos atualizar a migration então AIC upgrade head massa subir de novo aqui rodar outra vez legal retornou então a senha eil é user.com e a senha é string vamos fazer o login autorizou string beleza estamos autorizados aqui se a gente for criar um to do agora string
string beleza mesma coisa Execute e ele deu internal server error de novo e por que que ele deu internal server error ele falou o seguinte Olha o campo que você retornou aqui o Tod ele precisa aqui ó Type Missing Lock response ID a gente não tá enviando o ID de volta porque a gente precisava persistir isso aqui no banco de dados né então agora a gente vem na parte de montar o esqua do banco né a tabela do banco de dados até aqui tudo certo Deu para sacar Deu para entender o que que tá acontecendo
tá tudo bem aqui vão me respondendo aí massa temos esse esquema Mas a gente não tem a tabela do banco de dados que é a coisa que a gente vai ter que criar agora como é que essa tabela vai ser ela vai ser exatamente igual a gente tinha antes né eu vou registrar uma tabela ela vai ter um to do aí ela tem um ID init fse né a gente nunca vai passar é o banco que que decide qual que é isso aqui ela tem uma chave primária ela vai ser a chave primária Então a
gente tem o título que é uma string a description que é uma string e o state ele pega aquele conceito que a gente tinha visto lá né então ele vai ser um tipo to do state aqui no modelo Por que que ele é um tipo to do state aqui embaixo porque a gente tá dizendo que o banco de dados só vai aceitar um desses cinco valores também da mesma forma que tava lá na api tá aqui também a única coisa diferente dessa tabela tirando essa parte do state é que essa tabela ela precisa saber quem
é o o detentor da tarefa né Quem foi que criou essa tarefa Qual foi o user que foi lá no na aplicação e falou olha eu quero criar a tabela ou a nota um que é sei lá dormir ligar para minha mãe qualquer coisa então eu preciso de um relacionamento aqui dentro e essa parte do relacionamento aqui é isso aqui deixa eu trazer para cá pra gente discutir então Ó eu preciso falar que existe alguém que detenha essa tarefa que é o user ID o user ID ele é um campo da outra tabela da tabela
user tá vendo e como é que a gente vai relacionar essas duas coisas aqui no maped colum eu posso falar Olha vou criar uma chave estrangeira uma for Key E aí essa for Key é users.id Ou seja users é o nome dessa tabela não é o objeto user é o nome da tabela users pid que é esse ID aqui que é o relacionamento entre as duas coisas então a partir disso aqui eu consigo saber ah eu sou usuário batatinha xpto meu ID é 5 Quais foram as tarefas que eu criei porque eu tenho o ID
de quem detém essas tarefas fez sentido Então a gente vai importar isso aqui que é o for a partir desse momento a gente já tem um relacionamento simples entre as duas entre as duas tabelas então é um relacionamento Mega simples Mega simpl Mas ele já funciona se eu quiser listar todas as tarefas do Vinícius seito Silva Eu só preciso saber o id dele e a partir eu consigo pegar todas essas coisas então a gente tem essa tabela agora que é o nosso parece muito mais complicado do que realmente é né tipo assim bom beleza eu
só preciso falar que existe um campo que se relaciona com a outra tabela simples massa e aí a gente pode começar a implementar o banco de dados por mais sei lá complicado que isso fosse parecer é super simples né porque agora eu vou vir aqui então sei lá models agora eu vou pegar o models to do E aí agora eu posso pegar esse Tod aqui e começar a brincar com ele então to do é o DB to do né Naquele esquema que a gente a gente tinha feito até a as aulas passadas né que tudo
que era do banco a gente chamava de DB né E aí o que que ele vai pegar ele vai pegar do to do skima o que veio o que é o título O que que é a descrição Qual que é o estado tudo isso veio da api e o user ID que a gente vai usar é o do current user que a gente poderia chamar aqui né de Rent né para ficar mais simples aqui né esse é o current user então é quem tá logado na aplicação quem tem o seu token quem tem o seu
negócio e a partir disso aqui a gente consegue simplesmente bater e cadastrar isso aqui na nossa aplicação vamos ver o que que acontece quando a gente sobe o servidor aqui e tenta criar um todo eu ainda tô logado porque o meu quem tá válido né eu vou simplesmente tentar refazer essa coisa então título string description string state draft Execute deu internel server erro de novo vamos ver o que aconteceu Ele falou o seguinte olha SQL alchemy extension Operation exceptions um erro operacional por que que deu esse erro operacional ele falou aqui ó skl Light 3
operational error no sech tables to do ou seja ele tentou fazer aqui ó o insert into to doos mas ele viu que não existe a tabela to doos e isso é o motivo do erro por quê Porque a gente não criou essa tabela no banco de dados né embora a gente tenha uma referência para ela tenha todo esse esquema para ela ela ainda não existe aqui né então a gente tem esse errinho aqui antes de fazer isso aqui antes da gente ir resolver o problema de migração eu quero fazer os testes disso aqui aí você
vai falar bom mas como é que a gente vai fazer os testes antes de fazer a migração porque lembra que a sessão do banco de dados ela é criada na fixture e a fixture de session ela vem aqui pega tudo o que tem na nossa Tab no nosso moddel cria e descria depois então a gente consegue fazer os testes disso aqui vamos lá é é um teste simples né é a coisa que a gente tinha feito sempre né então tem test Shu ele pega o o o client o token e tenta fazer essa requisição Então
vamos lá agora a gente vai criar um novo arquivo né que é o test to do.py vamos lá o que que tá acontecendo nesse teste linha a linha né Para ninguém se perder ele cria um cliente ele pega o cliente de teste né do Fast api e aqui no cliente é onde acontece aquele malabarismo né de criar todas as coisas cois né então vamos lá no conf test a fixture de cliente pega isso aqui troca essa sessão aí ela chama a fixture de session e a fixture de session faz isso aqui né Create All drop
All então ele não depende do alembic ele não depende da migração ele vai simplesmente olhar tudo que tá registrado no table registry que é Essa paradinha que a gente tem aqui e essa classe nova que a gente fez Tod também faz parte dele então a partir disso aqui a gente precisa de um token e a gente consegue mandar para lá né então a gente pegou então geramos o cliente usamos o token a gente vai fazer um post lá em barra todos vai mandar o token porque precisa né porque isso aqui tá precisando do esquema de
autenticação para poder criar aí e eu vou mandar aqui ó test to do description test do description state draft e a gente tem que receber a resposta né que ele voltou com um é o test to do todas as coisinhas né aqui a gente tá testando response Model e o response Model é o to Public e o to do Public ele volta com title script Station state e ID Então vamos vamos rodar isso aqui Task Brum Task test né Talvez ele de erro de formatação é deu Task Format Task test legal rodou aqui falhou vamos
ver o que que falhou aqui ó eu vou dar um eu vou rodar aqui no outro Shell porque aqui a gente consegue ver o Shell todo né Task test ó ele deu essa falha aqui ele falhou nesse test deu um erro grandão aqui ó no test Create to do ele falhou e o que que ele tá falando aqui pra gente Beleza beleza escreveu PR caramba escreveu escreveu escreveu o que importa pra gente é o que tá lá no final aqui ó Type Missing lock no response falta um ID mess tal tal tal aqui ó o
to do schema que ele mandou tinha title description o state mas não tinha o id o user ID no caso ah interessante porque aqui a gente tá chamando de ID e aqui a gente tá chamando de neste a gente tá chamando de user ID né Tá vendo que tem uma diferença aqui então na hora que ele vai pegar isso aqui não existe Mas é estranho né porque isso aqui tem o ID dele e não precisaria tá nessa relação toda né vamos ver o que que tem nesse tudu DB olha aqui o que aconteceu eu já
achei o erro ó a gente tá retornando o tudu e o tudu não tem ID né Vamos mas eu queria mostrar para vocês como é que a gente descobriria isso aqui toda vez que a gente tá executando P test eu acho que essa é uma dica muito válida que eu não dei no curso inteiro toda vez que a gente tá executando P test a gente tem uma funcionalidade que é o seguinte a gente pode mandar menos x x quer dizer que ele vai parar no teste em que der erro então vamos lá ah Task teste
os X que é do P test ele vai parar no teste que deu erro então ele vai rodar até chegar no que deu erro fala ó beleza deu ruim ele não executa mais testes então fica mais fácil de depurar aqui que mais que eu quero saber aqui dentro se eu rodar um outro parâmetro que é o menos menos PDB ele vai parar no debugger dentro do que deu X V vamos ver o que que acontece beleza ele parou aqui ele deu erro na validação uma coisa interna do pantic vou dar um up up de novo
await tal ó Foi um erro muito interno a gente não consegue chegar lá onde ele deu esse erro pra gente tá vendo é meio bizarro a gente não consegue saber onde deu esse erro porque tipo assim é uma stack se a gente de um w aqui é tudo isso aqui que deu erro lá no no piden então o erro é a única coisa que pode ajudar a gente a descrever o que deu Aqui ó ele falou tá faltando o ID massa vamos pegar aqui em vez de retornar o tudu que a gente tá retornando a
gente vai retornar o DB tudu agora ele tem ID vamos ver se ele vai dar mais algum erro eu acho que sim mas agora é uma hora boa bele Task Format meu Shell deu uma bugada aqui V Task Format beleza Task test agora tem ID Mas você tá vendo uma coisa aqui que é interessante esse teste aqui não volta o outro ID que a gente tinha aqui né tipo assim ele não fala quem é o user que detém esse esse essa coisa aí é uma questão do que você vai querer assim eu queria levantar essa
questão porque é o seguinte se você vier aqui no esquema e colocar o user ID int Olha o que que vai acontecer agora no teste ele vai quebrar de novo mas por quê Porque agora o item veio aqui ó veio com tudo isso mais o user ID Dependendo do que você tiver fazendo aí na sua aplicação às vezes você quer retornar quem é o detentor da tarefa às vezes você não quer então só o fato de você colocar esse campo aqui vai trazer essa informação você não precisa mexer em mais nada dentro do código só
no skima porque o esima tira Ou coloca isso aqui massa é uma informação importante aqui então tiramos de lá vamos rodar de novo tudo funcionando se a gente for lá dar o o coverage vamos lá no coverage de novo dar um F5 aqui tá testado massa fizemos aqui essa parte toda só que você lembra que isso aqui ainda não funciona né lembra aquela brincadeira que a gente tava falando que o teste engana na aula de refactor o fato do teste tá funcionando não quer dizer que a aplicação está funcionando vamos lá Task rum a aplicação
sobe tá linda maravilhosa aqui tudo funcionando Mas se a gente tentar criar um todo aqui deixa eu fechar isso aqui se a gente tentar criar um tdo ele tá com interno server error porque a gente não tem a tabela de tudus Isso é um problema Você tá vendo que o nosso teste não garante que as coisas estão funcionando de fato é importante saber isso aqui o teste garantiu a funcionalidade mas ele não garante que o banco de dados está no estado perfeito emaculada que precisaria tá isso aqui é outra camada de teste que a gente
precisa fazer que vai pros testes end to end os testes estão no ambiente controlado né são testes de unidade durante os testes a gente não usa o banco de dados de verdade né a gente tá substituindo ele aqui e o fato da gente fazer essa substituição faz com que a gente não consiga pegar esses erros de banco de dados Mas eles são eles estão em outra camada uma coisa que não vem muito ao caso aqui nos testes de unidade que a gente tá fazendo Mas é interessante saber isso então beleza funciona não funciona deu erro
no se tables n então não existe a tabela to do então o que que a gente vai ter que fazer a gente vai ter que chamar o nosso amigo alanic e falar olha vamos criar uma nova migração e o que que essa migração vai fazer simplesmente vai ler o que tinha lá e vai falar ó Create toce table massa é a mesma é o mesmo comando que a gente tinha executado antes né Tipo na aula onde a gente criou o outro banco de dados Então se a gente der um Create to table legal ele gerou
uma nova migração aqui ó gerando a migração tal tal tal vamos lá ver o que que tem nessa migração aqui migrations versions e tá aqui ó ele criou criou uma tabela chamada to do que tem a ID título descrição estado e aí aqui ó o enum aqui ó o enum tá cravado na tabela do banco de dados tá vendo não é uma coisa que tipo assim ah tá tudo bonitinho Não ele está cravado aqui não adianta você ir lá e mudar o colocar mais uma coisa lá no Tod state se você precisar mudar o state
e colocar aqui batata recebe batata não vai funcionar porque isso aqui tá cravado lá na migração você vai ter que gerar uma nova migração para dizer que mais um estado é suportado maassa então isso aqui é importante de ficar frisado is está hard code no banco e ele falou Olha tem uma coluna user ID a nossa chave primária é o id e a nossa chave estrangeira né é user ID é o nome do nosso campo e tá lá na tabela users no campo a partir disso aqui beleza geramos migração vai funcionar não vai funcionar de
novo por porque a gente não aplicou a migração né Vamos tentar criar internal server error não existe a tabela ainda por que que não existe a tabela ainda porque bom a gente não aplicou a migração no banco então eu tenho que vir aqui a upgrade Head Massa agora isso aqui está aplicado no banco de dados se a gente for lá e entrar no sei lá skl TR database.db um ponto skima você vai ver que tá aqui ó Create tables to maassa então a questão aqui é que a tabela tá aqui mas e se eu precisasse
voltar no estado anterior pra gente simular aquele esqueminha para trás eu poderia vir aqui e fazer o seguinte olha ah alembic downgrade é downgrade downgrade Esse comando aqui downgrade Se você não souber Só D um alembic alembic downgrade aí ele vai falar para que revisão Você quer ir né se você vier aqui der um versions no alembic você consegue ver não é versions é revisions History eu não lembro mais History faz tempo que eu não mexo com isso aqui ó ele tá aqui ó existe a base do banco de dados a primeira migração é essa
aqui ó Create user table a próxima ela parte dessa e vai pro Create do table que é o que é o head tá vendo aqui então se eu tô nessa migração eu quero vir para essa aqui eu posso fazer isso de duas formas eu eu posso saber o id da migração então eu posso fazer isso aqui ó Então você deu um History viu qual que é a migração a lambic downgrade ele voltou pra migração anterior se a gente for lá no banco de novo agora e ver qual que é o esquema só tem a tabela
anterior não tem mais aquela que a gente tinha então eu posso dar um Exit aqui e sair e se a gente der aquele upgrade de novo ele sobe pra última migração se você precisar que foi o que que que o Carlos Ramos deu aqui né você poderia voltar assim ó menos um você também pode e você pode dar o upgrade mais também também funciona então você consegue ir e voltar fazendo esse esquema aqui para ter certeza que eu tô na última migração upgrade head pra cabeça né do histórico então a lambc lembra History o de
vocês deve ter mais migrações do que a do que o meu porque vocês fizeram outras migrações durante o meio do caminho mas é isso aqui tá aqui tudo funcionando bonitinho então a gente está no Head agora eu posso dar um Task Run e eu tenho a certeza a garantia de que a tabela foi criada né então vou tentar executar aqui to Execute massa temos aqui nossa tabela title string description string state draft e o ID é um ou seja está no banco de dados maravilhoso maravilhoso tá funcionando a gente conseguiu superar essa etapa essa etapa
é complicadíssima de fazer né tipo é é muitas coisas né tipo assim para fazer um endp teve que fazer migração tabela nova eu sei é tudo um punhado de coisas que a gente já viu Nessa nas outras aulas mas tipo assim em modo Speed Run né então agora funciona tudo bem para vocês até aqui deu tudo certo tudo certinho podemos continuar alguém tem alguma pergunta para fazer isso aqui pode ir perguntando eu vou seguir aqui mas a gente para faz pergunta responde sem pressa tô sem pressa nenhuma então vamos lá a gente tem o parte
TR para mim deu não autorizado então é que você tem que fazer o login antes mano tipo aqui lembra que eu fiz a minha autorização aqui em cima aqui em cima eu fiz a autorização eui a você tem que criar um user logar e depois fazer sua sua própria coisinha massa faz sentido legal e se e se e se um tudu pudesse ser de vários usuários aí é uma questão para implementações futuras né Por enquanto a gente vai manter o simples aqui e aí Me perguntaram programador pyon uma pergunta que é fora do escopo cara
eu vou não vou gastar tempo respondendo coisas que fogem da aula senão a gente desanda aqui massa parte três dessa aula a gente vai criar um end Point de get e o endp de get ele é maravilhoso porque aqui a gente pode explorar diversas coisas diversas coisas Ah tem uma pergunta aqui do Wesley nesses upgrades do alembic se eu fizer impr produção perde todos os dados sim perde todos os dados em produção por isso pense bem antes de fazer esse tipo de modificação tem um jeito de fazer isso aqui que são migrações offline que não
quebra o banco ela gera um código SQL que você pode alterar e tudo mais massa na Live sobre a lambic a Live de migrações tem tem vários questionamentos sobre isso então você pode assistir lá porque é um momento onde a gente fala exatamente tinha uma aula inteira sobre migrações o upgrade da da versão do banco só Altera a estrutura e não os dados Então essa é uma essa é uma preocupação que você tem que ter se você mudar a estrutura do banco vai mudar tudo saca tipo assim se adicionar um novo Campo você vai ter
que você vai ter que preencher os campos do que não tinha antes ou o campo vai ter que ser opcional Então essa é uma questão que você vai ter que ver na hora de fazer a migração de novo Isso aqui é uma é um bom papo legal para vocês larem dar uma assistida na aula de migration Se alguém puder mandar o link eu vou ficar muito feliz então vamos criar agora o end Point de get e no end Point de get eu quero fazer várias firulas porque agora a gente pode né olha isso aqui olha
que mirabolante essa estrutura aqui eu tenho session o current user E aí eu tenho vários outros Campos aqui title description state offset e limite que que eu quero dizer com esses campos a gente vai criar algumas coisas aqui que são muito interessantes mas o que que é tão interessante aqui vamos pensar que eu quero filtrar as minhas próprias tarefas então eu não quero pegar todas as tarefas mas eu quero pegar as minhas tarefas que tem o título ligar ou então que tem a descrição batata frita ou então todas as minhas tarefas concluídas ou então Quero
mostrar a lixeira então eu quero todas as tarefas que o estado é trash massa Ah eu quero de todas essas eu quero pegar só cinco de todas Ah mas eu quero as próximas cinco não as primeiras cinco então offset com isso aqui a gente expande uma gama incrível de possibilidades dentro desse end Point e é muito massa poder fazer isso aqui né dá pra gente ir explorando várias coisas várias possibilidades aqui né E isso aqui vai ficar muito legal lá no nosso muralzinho da documentação vocês vão dar uma olhada uma coisa que eu queria fazer
aqui é criar esse esquim que é o Tod list né que é o que lista todos os públicos pra gente poder responder nesse modelo aqui né então basicamente o que ele faz aqui skemas é pegar vários públicos e retornar uma lista com vários todos públicos só pra gente ter uma forma de resposta nesse endpoint aqui é isso aqui né to do Public vamos dar uma olhada em como que isso aqui fica quando a gente sobe o servidor e vai lá na documentação ó agora eu tô aqui no to do e eu tenho o get Olha
que legal agora eu tenho a opção de de perguntar eu quero só os que tem título S só os que tem s no título a gente executaria vai dar erro porque a gente não não implementou nada ainda né mas eu quero só os que TM a descrição tal tal tal o t list não é para ser response ô to do list é coloquei errado aqui to do list obrigado não era o t do Public eu fui no na emoção do autoc complete aqui list Mas beleza ele também ele também não funcionaria ligado tá tudo bem
aqui name error to do list not to list eu escrevi errado aqui list agora vai legal aí o vor fez uma pergunta é possível adicionar mais documentação para ser exibida no SW sim é possível então daria para escrever outras coisas pode ficar vont depois a gente discute sobre isso legal aí fala ó eu quero s eu quero que tenha a descrição blá blá blá o estado é tal o offset tal limit tal massa a partir disso aqui a gente consegue fazer esse esqueminha legal bonitinho né E aí como é que a gente vai implementar esse
endp agora entra uma questãozinha de SQL Alem bem legal bem divertida aqui a gente vai selecionar né selecionar todos os tud então vamos comear aqui então from skem alemy Import select e a gente vai falar o seguinte Olha quem que a gente quer trazer aqui então tem todas essas variantes Então posso passar o título tal não sei o Então a gente vai selecionar selecionar o os n a gente vai selecionar os Então eu preciso saber se o user ID Ah pera aí Tod ponto user ID é igual ao corrente user né user.id que a gente
tá recebendo beleza porque a gente só quer listar os dele né então aí eu coloquei isso aqui como query Você tá vendo que eu não est chamando a session aqui isso aqui é importante de ficar percebido aqui não estou chamando a session não tem session aqui é só o select a session a gente vai chamar no último lugar aqui então vamos lá isso aqui eu vou chamar de query né é uma busca que a gente tá fazendo no banco de dados aqui a partir disso aqui eu quero saber o seguinte se tiver título eu quero
saber se o título contém o que a gente passou né então vamos lá então if title se tiver se a gente passar o valor de título aqui eu quero fazer o seguinte eu quero falar lá pra query que ela vai se atualizar aqui então query P Filter Então a gente vai filtrar os resultados dessa primeira busca e os resultados dessa primeira busca tem que ter o todo ponto title Pens cont o quê O que a gente mandou no título aqui então o que que ele vai perguntar aqui ah se eu passar a palavra tipo batata
então ele vai pegar para mim todos que o título tem batata internamente fez sentido o uso do contain aqui então a gente criou uma nova query a partir disso a gente poderia fazer um filtro muito mais avançado difícil de ler mas a minha ideia é tipo assim vamos usar o código mais simples possível não precisaria desse if aqui mas eu tô na na brincadeira do mais simples massa a mesma coisa se vocês não entenderam pode perguntar por favor a mesma coisa que a gente vai fazer pro título a gente vai fazer pro description se tiver
description a gente quer saber se o description contém um pedaço da descrição que a gente tá enviando aqui dentro massa e aí o que que tem por último o state só que o state ele não é a mesma coisa tipo assim o o state ele é um pouquinho diferente né if state se for passado o state eu vou atualizar a query onde query pon Filter só que eu quero filtrar não vai ser a mesma coisa aqui a gente vai ser um igual né porque aqui eu não quero saber o que contém draft né Eu quero
saber o que contém sei lá to do o que é igual a Tod do que é o estado que eu vou pass aqui em cima se tiver o estado massa Então não é isso aqui no caso tá filtrando das tqu do próprio usuário sim porque a gente começa aqui né onde o usuário é tal a gente poderia fazer isso aqui usando we também é porque eu queria mostrar um recurso novo we eu queria mostrar isso aqui para vocês mas Vocês poderiam usar não tem problema eu tô usando filtro Porque sim aí O Jorge falou pode
ser o i cont também pode ser não tem problema aí é uma questão de gosto de implementação e tal é a ideia é só isso aqui só para mostrar para vocês que a gente consegue usar essas coisas para fazer um filtro Então a partir disso aqui ó a gente vai fazer a query Inicial Ah beleza são todos os todoos de quem chamou esse end Point massa depois disso eu quero saber desses todos Quais são os que contém um pedaço do título quais tem e esses filtros podem ser todos combinados você pode mandar um pedaço do
título um pedaço da descrição nos tudus limitados por três na página seis sabe tipo assim então você pode fazer uma combinação maluca de tarefas aqui massa faz sentido isso aqui deu para sacar o que que tá acontecendo aqui e aí depois disso aqui a gente vai pegar todos os todos e vai chamar o scalars e vai pedir todos os todo mundo ó que massa Então pega fala pra sessão performar quer né então tipo assim executa essa query aqui qual é ela não sei não sei por onde ela passou aqui dentro a partir disso aqui a
gente vai aplicar os offset limite então set limite massa que aqui tá como Nani mas poderia ser o seguinte ó uma outra uma outra dica aqui é in mas pode ser zero tá ligado Tipo assim Beleza eu vou usar o Nani aqui vamos ver o que que acontece a partir de agora aí o que que a gente vai retornar disso aqui return agora a gente tem que garantir o esima né que a gente tinha que é o o t list aqui né então eu tenho que mandar isso aqui vai ser e o conteúdo dele é
ozinho massa tá de pé vamos lá ver o que que acontece agora então de novo eu preciso logar aqui né então vamos lá autorize eu não lembro mais quem era o meu usuário aqui vou criar outro tá tudo bem users try então user 2 eu nem precisava mudar né esse usuário tá no banco user tal tal tal eu escrevi errado return não tá certo não é uma lista de tudus sim é uma lista de tudus tem o campo tudu e dentro desse Campo Tem uma lista de tudus é o esima tem a chave tudu tudus
e dentro e o valor dela é uma lista de tudus é isso aqui Ó cadê cadê cadê cadê isso aqui nem vamos usar mais aqui fez sentido aqui então Legal vamos voltar lá no swager vou usar isso aqui a senha string autorizei beleza vamos ver os meus shus aqui então vamos dar um get aqui try out eu não vou limitar por nada aqui vou dar o to do purão Execute ele rodou a gente tem um Tod aqui se a gente criasse outros título falar com o [Música] Carlos responder ele na Live chudo massa mandei para
cá vamos executar de novo sem nenhuma limitação e tá aqui ó tipo assim Ah então a gente tem que falar com o Carlos responder na Live Então a gente tem um em draft um tudu vamos filtrar o estado por tudu massa então ele só retorna O falar com Carlos Ah vamos pro estado do Draft Execute tá aqui só o que tava em draft Se eu colocar aqui sei lá o d ele executa a quer inteira opa não não enviei e não me retorna nada porque eu não tenho nada em Dan fez sentido esse filtro Ele
é legal para caramba né tipo assim dá para usar para um monte de coisa a parte difícil disso aqui é escrever os milhares de testes que tem aqui dentro disso porque vocês imaginam que são muitos testes né tipo tem que ter um teste que tem Filter tem que ter um teste que tem o o filtro de título um que tem o filtro de descrição um que tem o filtro de state e várias outras coisinhas aqui né Essa parte dá um pouco de trabalho mas é legal de fazer esses testes são os mais interessantes porque são
testes que tem muitos FL Então a gente vai ter que fazer vários testes maravilhoso se filtrar por um estado que não existe dá um erro vazio vamos ver o que que acontece filtrar por batata nada não existe não o ptic não vai retornar 422 porque essa validação tá sendo feita dentro do Fast api Mas você poderia falar o seguinte aqui que é uma outra coisa você poderia importar aquele esquema e falar que ele é desse tipo a query dá para fazer tipo assim ah o que que é esse estado é um to do state vamos
ver o que que rola agora subiu de novo F5 get TR out state batata ah deu que não t autenticado beleza string Close executou aqui aí ele falou unprocessable entity state Should Be A draft doing Don ou trash maravilhoso né só que o problema aqui é quando eu não mandar nada também funciona porque ele pode ser nan ó Que lindo que legal então vocês podem fazer esse tipo de validação aqui tá massa funciona também por isso que eu fiz o en1 porque o en1 Ele cabe em todos os lugares né isso isso é muito massa
tem coisas que você poderia fazer aqui que fogem um pouco do escopo da nossa aula mas tem um atributo do fash API aqui um objeto do fash API que se chama query query E aí você poderia passar um negócio aqui tipo assim ah vai ser isso aqui né no title por exemplo o padrão é query por exemplo query E aí o que que vai ser essa query aqui você poderia falar várias coisas aqui tipo assim Ah tem que ser sei lá less Dan então precisa ser maior do que 10 Sabe tem tem coisas mirabolantes que
daria para fazer aqui eu não vou entrar nesse ponto mas experimentem sabe porque dá para fazer muita coisa ali dá para fazer muita coisa divertida Legal vamos fazer os testes disso aqui agora vamos fazer os testes disso aqui aí esse era o nosso skima que precisava bom o que que o que que é interessante aqui de falar nos testes disso aqui né então beleza A gente tem que testar os parâmetros dos pefs né então a gente precisa testar tudo né o title description State offset e limit são cinco a gente precisa validar os filtros né
então a gente precisa saber se o título funciona com descrição funciona com state como é que a gente combina essas coisas então isso é um pouco mais complicado e também tem aquele nosso amigo Factory Boy que vai o quê salvar nossa vida aqui né porque se eu preciso testar cinco filtros então vou ter que adicionar cinco users aí como é que eu faço isso Factory boy ó malandrinho né então vamos lá a gente vai criar um modelo para fazer isso aqui eu vou copiar aqui e aí eu explico lá o que que tá acontecendo vamos
lá nos testes ã conf test a gente criou aqui no primeiro o o esqueminha eu quero trazer esse aqui pra gente discutir aí eu já vou fazer os imports então a gente tá onde tá o user a gente vai trazer o Tod fábrica de boys né Beleza aí a gente precisa trazer o to do state para cá também que tá também no models to do state e aqui no Factory boy eu quero importar essa outra coisa aqui que se chama fuz já vou já vou explicar para vocês o que que faz isso aqui então olha
que interessante aqui esse esse tudu a gente tem um meta né ou seja ele vai criar o objeto do tipo tudu a gente vai usar isso aqui ó olha que bonito isso aqui Faker aqui a gente começa a pular de alegria né aqui a gente estava gerando os atributos sequenciais e tal Faker significa que ele vai criar um dado de mentira Como assim vai criar um dado de mentira ele vai simplesmente pegar um texto aleatório que ele tem e colocar aí pro description ele também vai usar um texto fake maravilhoso né E aí o estado
ele vai chamar esse esquema aqui ó Factor Fuzzy Fuzzy Choice E aí o que que faz esse Fuzzy choice fuz Choice é tipo assim escolhe aí ele vai pegar um valor randômico de dentro do Tut state ou seja ele vai pegar um texto que ele vai gerar pra gente no título um texto na descrição vai escolher um state pra gente dentro dessa parada e ele vai usar um id o id é o user ID que eu vou usar o um como base porque a gente não precisa de n usuários por enquanto n só um cara
isso aqui é muito doido Não é tão doido que eu vou ter que subir aqui pra gente ver Inteligência Artificial não não tem nada de Inteligência Artificial aqui então vamos lá Python Ah menos I teste conf test beleza executamos aqui o conf test eu quero pegar esse modelo aqui que é o to do Factor para mostrar para vocês o que que esse objeto gera então to do Factor Olha isso não fala se isso aqui no é maravilhoso ele pegou aqui ó id não tem ainda né porque foi no banco o o título é reflect identity
ur Tex Special tipo sim ele gerou é um gerador de lero lero né Igual vocês estão falando aí então o título é um lero lero o description é um lero lero e o state é o draft e o user ele tá fixo aqui se a gente rodar outro gerou outra coisa e o estado é Dani agora e aí a gente vai rodando aqui ele vai gerando textos completamente aleatórios e Malucos uma coisa a gente não vai usar mas dá para fazer isso aqui ser em português gerar tipo cartão de crédito cpf rg é maravilhoso maravilhosa
sabe sensacional isso aqui é incr incv É incrível quando eu falei que o factory Boy era uma ferramenta incrível era PR vocês terem me levado a sério porque o factory boy é literalmente incrível e por dentro disso aqui ele usa uma outra biblioteca Python que é o Faker E aí ele pega aqui ó ele pega do próprio Faker que é essa biblioteca maravilhosa que aí você fala qualquer coisa para ele ah gera um fake cartão de crédito ele faz isso aqui então tá tudo aqui vocês podem vir aqui e olhar se vocês quiserem entender os
outros Campos do Factory boy e tal do Faker e tudo mais tá tudo aqui massa não vou entrar muito nesse detalhe mas é um assunto que me deixa bastante intrigado porque isso é maravilhoso tá ligado Então Legal vamos fazer o nosso primeiro teste e aí o que que eu quero fazer eu quero inserir cinco todos e agora a gente vai conhecer uma outra instrução do Factory Boy que é sem simplesmente indescritível que é essa aqui ó Create batch Então vamos lá a Factory booy Create batch E aí você fala quantos eu quero eu quero 10
Sim Ele criou uma lista com 10 tudus então beleza vou fazer dois aqui para vocês verem então ah l todus dois todus a partir disso aqui a coisa começa a ficar mirabolante tá ligado Tipo assim ah eu quero criar o o o b mas eu quero que o título ó ó ó eu quero que o título seja a a todos título a a nesse aqui to do título AA para não tá ligado Tipo assim se o Fest api todas essas coisas não te deixou animado tipo assim ah nem o p ID te deixou animado o
factory Boy deixa qualquer pessoa animada isso aqui é sensacional maravilhoso sou sou fã dessa biblioteca Mas é isso vamos seguir o jogo aqui senão eu não acabo nunca aqui então o que que eu vou fazer aqui a gente vai chamar esse esse esquema Então vou criar aqui ó um esse teste que a gente deu aqui vamos lá então a gente tá lá nos testes to do Então a gente vai criar esse teste aqui então test list to do should Então deve retornar c to do para isso aqui a gente precisa de uma coisa meio mirabolante
né precisa ter o a session porque a gente vai usar ela precisa ter o Cent porque a gente vai usar o client precisa ter o user porque a gente vai usar ele e precisa ter o token porque a gente também vai usar o token a gente vai usar basicamente todas as fixes que a gente fez tá ligado aí o Igor perguntou aqui como é que faz relacionar as factures por exemplo passar o user Factor no user ID ah essa é uma pergunta interessante a gente não vai ver isso aqui mas dentro do meta você consegue
especificar os relationships é é bonito é bonito a gente não vai ver isso porque senão não não acaba nunca essa essa coisa então eu vou falar o seguinte Olha eu espero que tenha cinco todos eu quero ir com vocês até essa linha aqui porque isso aqui é maravilhoso então eu tô esperando cinco tudus a gente precisa importar o factor Então vamos lá from conf test from test PC test Import Tod Factory massa importamos o factor e olha o que que a gente vai fazer aqui Aqui começa mais bruxarias aqui né de teste a gente vai
fazer aquele esquema que a gente tinha dito ali então a gente vai criar um batch A então a gente vai criar cinco tarefas dessas cinco tarefas a gente vai usar o user ID fixo eu não sei qual é o user que o factory Boy vai gerar nesse momento qual que é o ID do usuário porque isso aqui esse user também é dado pelo Factory boin então precisa de um ID ok aqui então a gente pegou o ID disso aqui a gente vai fazer essa chamada do session aqui que se chama book save objects e o
que que é book save né então o book ele vai pegar uma lista de objetos e colocar todos eles na sessão lembra que a gente estava dando AD session PED adiciona um adiciona dois adiciona sabe você vai adicionando AD add add add aqui você pega uma tonelada de objetos ou seja uma lista de objetos e coloca todas elas na session de uma vez aí você vem aqui beleza session comment então a gente esperava C fez esse rolê gerou cinco com B salvamos as cinco na sessão demos o Comet inserimos os cinco objetos no no banco
de uma vez só é tipo é é uma linha de código que insere os cinco objetos de uma única vez para tipo quando você vai entendendo a dinâmica do teste ele vai ficando maravilhoso né então a gente vai fazer um get né no no client usando o client do F api sem query nenhuma né A gente só quer ver se vão retornar cinco objetos é é só isso que a gente quer saber a gente precisa mandar o token porque precisa est autenticado para tá lá dentro e a gente vai pegar o Tod e simplesmente ver
retornou cinco Então a gente vai pegar o Jon de resposta vê os tudus e falar retornou o cinco se retornou o cinco ó Maravilhosa vamos rodar e ver o que que acontece aqui eu tô rodando aqui né fora pra gente ver tudo então Task teste precisamos formatar Ah ficou o quer importado algumas coisas aqui então Task Format Task test ah sensacional funcionou vamos ver a nossa cobertura agora né que é onde a coisa pega aqui funcionou tá tudo certo mas não tá resolvido ainda né a gente não testou o título a gente não testou o
description a gente não testou o state mas a gente conseguiu inserir cinco registros aqui dentro de uma vez e testar para ver se tudo funciona a partir disso aqui agora a gente vai modelando esse esse bch né então beleza Ah eu preciso saber se tem alguém que tem aí a gente insere com a a gente insere título com a negócio com B começa a cruzar os filtros aqui dentro e aí com isso a gente começa a construir vários testes e vários testes que passam nos lugares onde a gente precisa eu me empolgo muito falando de
teste desculpem por isso é maravilhoso então vamos ver o que que acontece aqui vamos testar o offset e o limit a gente vai ver a mesma coisa que a gente tinha visto antes né então eu preciso agora eu vou criar os mesmos cinco que a gente tinha feito antes só que eu vou falar que eu quero limitar em dois a resposta então ele vai ter três páginas né A primeira página a página zero que tem o registro um e do a página 1 que tem o registro 3 e 4 e a página 3 que tem
o registro de id5 massa então fazer o seguinte olha limita por dois me dá a página número um né que é a segunda são registro dois e três Então a gente vai inserir cinco rodar essa quer né então offset 1 limit 2 e esperar que retorne só dois ou seja a cobertura não vai mudar em nada mas a gente vai testar melhor essa última linha aqui fez sentido esse teste aqui ou pareceu uma coisa muito Alienígena aqui né me contem assim Pode ser que seja muito estranho ainda esse teste pode ser que o outro tenha
dado uma travada né tá tudo bem né Então como é que é o nome desse teste né então test list do pagination que é a paginação sh Então deve retornar somente dois tudus vamos rodar e ver o que que acontece maravilhosa passou também mas ele não não melhorou a cobertura isso é interessante de ficar frisado aqui né não não tem cobertura massa tá tudo bem tá tudo certo tá tudo legal tá funcionando bem então a gente vai ter que fazer o que agora testar as outras coisas n ainda falta o title description e o state
Então agora eu vou testar por título e olha o que que eu fiz aqui eu tô usando a mesma estrutura do teste para tudo aqui mas aqui a gente tá criando um batch onde o title é test to do 1 então lembra o Bet cria cinco todos os cinco tem esse mesmo título Então a partir disso aqui a gente vai buscar pelo título teste o do um e ver se as coisas conseguem chegar aqui aí o t pergunta teria que testar quais objetos estão sendo retornados para ver se a paginação tá sendo feita da maneira
correta sim mas eu tô eu tô preocupado com os filtros agora tipo assim vê que a gente não tá testando o que a coisa faz mas tipo se faz os filtros eu eu pensando nesse esema por enquanto agora tipo assim lembra que cada teste tem sua caixinha né Então para mim agora eu tô preocupado tipo assim os filtros estão funcionando e depois a gente faz tipo assim os valores vê os valores que precisam vir sabe nesse sentido Então vamos ver esse teste aqui é basicamente a mesma coisa só que na quer aqui a gente tá
mandando o title test to do um Ou seja todos os que TM T do um ou seja vai ter que voltar cinco massa vamos rodar aqui e ver o que que acontece to test passou também se a gente for olhar o coverage tem que ter coberto o o filtro de título lindo né maravilhoso o J perguntou no caso teste passa porque title igual true sim é porque existe o título né ou tipo assim ou ele é string ou ele é n se a gente não passa ele é N E aí o Python classifica isso como
fal tipo assim aqui Python Então vamos ver aqui ó tipo assim n se a gente pegar e ver tipo assim qual é o tipo disso aqui bu que é o que o if vai fazer aí ele falou é false se fosse o inteiro ou uma string ele é true saca faz sentido isso aqui então é mais ou menos essa verificação que o Wi faz N perguntar o boleano disso aí é verdadeiro ou falso o fato de ser falso faz com que ele não entre ali mas ele sempre faz essa pergunta né então por isso que
essas linhas estão sempre cobertas sabe é isso C perguntou Tô terminando de ler o livro do Pens em Python consigo acompanhar esse curso cara tipo assim eu eu tentaria sabe vai vai ser um pouco difícil mas tem o grupo Vai perguntando acho que dá para tentar sabe Legal vamos pro próximo falta o description E aí o description é a mesma coisa eu criei um bagulho chamado description e passei aqui ó só o conteúdo olha que massa Então é só os que contém Desk não é tipo assim description é só Desk porque só um pedaço então
do mesmo jeito eu esperava cinco tô querendo cinco com description e vamos ver o que que rola aqui né Vamos brincar provavelmente vai passar se eu não escrevi nada muito bizarro ele passa passou então agora a gente acabou de testar o description n lindo maravilhoso aí falta o state Então vamos pro state aí o state eu coloquei todos em draft e tô fazendo aquela mesma coisa tipo assim Ah tenho vários cinco em draft eu vou mandar o state igual a draft e quero ver se a gente vai conseguir a resposta do que a gente queria
aqui o teste todos os testes são igais tá vendo tipo assim eu não tô mudando nada eu tô variando o filtro só quem já é mais manjado aí do P test sabe que daria para fazer isso com o quê Fica aí a questão daria para resolver isso com outra coisa aí aqui eu preciso importar o Tod state né isso aqui então vamos lá from Fast zero agora eu preciso do Tod Station né ponto models Import Tod state que eu quero passar exatamente massa aqui vamos ver ih preciso formatar pask Format esse copy paste tira graça
de escrever o teste sim tira mesmo mas se eu não fizer assim a gente não termina hoje isso aqui aí eu vou explicando e a gente vai vendo o que que acontece beleza passou também o que significa que está maravilhoso com o quê aí o Luiz falou com parametrize sim com parametrize daria para resolver isso aqui vamos ver aqui mas parametrizar tudo rotas filtros parametrizar só o filtro daria para fazer tudo em um teste só tipo essa parte de filtro legal temos 100% de cobertura incrível delicioso sensacional vocês acham que eu preciso fazer mais testes
aqui Alguém poderia falar já tem 100% de cobertura não precisa né mas e a combinação das coisas tipo assim e se eu passar o título no estado a com a descrição B isso não tá testado né seria bom testar Essa parte é a que mais dá erro em produção ou se precisa exatamente essa é a parte que mais dá erro em produção quando a gente vai fazer essas coisas de filtro então eu não fiz [Risadas] lição de casa mentira tá aqui no no no código aqui aqui ó tá tá na página eu não coloquei no
slide porque não c no slide é esse teste aqui para quem quiser pegar aqui depois não c no slide mas basicamente olha aqui eu vou criar cinco to do test to do combin com Bin description e eu vou criar um outro que vai ter três Olha que interessante com other title Order description e aí a gente vai fazer não fiz estilo Bruno al N E aí o que que a gente vai fazer aqui no final a gente vai fazer a combinação aqui ó a gente vai fazer teste o do combin combin então ele vai me
retornar todos que tem o teste do combination com a description combinate combined com o stated done e o Ramiro então é basicamente esse o teste aqui então a gente vai criar a gente quer cinco a gente vai criar esses aqui com done esses aqui com to do vai salvar tudo no banco e depois a gente vai ver se voltam cinco né porque tem que ser os que tem combined no no título combined no título tá aqui os que tem description combined que são esses aqui e os que tem o status done que são esses aqui
então no fundo a gente criou oito objetos mas só vai ter que ter cinco porque a gente tá restringindo tudo pelo primeiro massa vamos lá vamos ver se esse teste funciona é bem grande esse teste né é um são dois book inserts n tipo assim é é um pouco grande eu sei eu sei Task test Passou mudou a cobertura não mudou a cobertura já tinha 100% mas a gente não tinha testado isso aqui então eu vou deixar de lição de casa para vocês essa combinação de coisas tipo assim ah combinem outras coisas tem mais combinações
que vocês conseguem fazer aqui pô o o título tal com o estado tal com não sei o que cria cinco com o mesmo título e depois cria o outro cinco com o mesmo título mas muda o state sabe Dá para brincar aqui e dá para testar muitas coisas diferentes tem muitas coisas que são complicadas aqui de fazer mas eu acho que vocês conseguem tá ligado massa última parte mentira ainda tem mais uma ainda mas a gente vai pro delite pra gente ver o que que acontece Então qual é que a ideia do delite nada de
especial né o delite é literalmente o que a gente já fez no curso inteiro tá cansado de fazer né então não dei muita atenção né não tem muita prioridade ele tem um message que retorna Ah aest que foi deletada com sucesso ele tem um to do int o to do id que é tipo assim qual to do a gente quer deletar precisa dar session porque precisa pegar o banco de dados e a gente precisa do usuário corrente para você não deletar tesque do amiguinho é é simplesmente só isso se não tiver o número que a
gente quer not found aí se tiver a gente deleta na sessão adiciona na sessão delete faz o commit e manda mensagem a tarefa foi deletada com sucesso esse aqui não tinha nada demais assim tipo assim isso aqui é literalmente o que a gente já cansou de fazer aqui no curso né então por isso eu dei mais atenção pro pro get né o get tinha muitas coisas novas né ti assim ele é sensacional o factory boy é maravilhoso né Eu sou sou muito suspeito para falar do Factory boy eu adoro Factory boy então legal a gente
precisa importar o message o http Exception e o http status então aqui a gente tem o seguinte a gente precisa importar o dos nossos esquemas o message a gente precisa importar do Python from http Import http status e que mais que a gente precisa importar esqueci já o http Exception né que vem do do Fashion api from fash api P exceptions Import http Exception legal isso aqui é coisa que fizemos o curso todo né então não tem nada de diferente aqui como é que a gente vai testar isso aqui basicamente a gente vai inserir um
registro inserir um tudu né a gente pega faz um Factor USA o ID manda para lá e vê chama delite e falou ó Foi deletado com sucesso a mesma coisa vai acontecer pro erro né que é aqueles testes tipo assim pô tenta deletar o todo 10 Beleza o t do 10 não existe né porque o banco é Zerado todas as vezes a gente não inseriu nenhum então ele vai dar o 404 Esses são basicamente os testes de user né que a gente já tinha feito então vou copiar isso para lá a única diferença desse teste
aqui é o delite Agora eu preciso importar o htp status aqui né então vamos lá from http Import http status E qual é que é a grande sacada aqui né tipo assim beleza a gente tá usando Factor para fazer essa tarefa só isso de diferente tipo em vez de colocar um book insert fazer aquele todão de coisa a gente simplesmente tá adicionando na sessão como sempre fizemos session PED s. commit a gente cria um todo usando Factor E aí a gente pede pro delete funcionar ele vai tirar o ID do todo que foi inserido na
tabela se quiser a gente poderia fazer aquele esquema lá né tipo assim ah session P refresh Tod se você achar que é necessário e a gente vai pegar isso aqui vai mandar o o token vai dar ok 200 né e vai dar o has been deleted successfully ah bonito né Chique né o term inglês Task Format ah aí ele deu que tem uma linha muito longa no Test chudu é essa Exatamente Essa aqui que a gente tá ó Ó que bonito a gente pode quebrar aqui simples formatou testou 100% de cobertura mentira não vai dar
100% de cobertura é eu escrevi errado aqui o refresh refresh a agora agora vai funcionar o teste né se escrever certo as coisas funcionam Legal vamos ver o coverage vai faltar aquele izinho ali né que dá o Exception E aí é o teste que a gente também fez várias vezes né Manda um ID que não existe se ele não existe retorna [Música] O not found esse não tem nenhum mistério né tipo assim é literalmente só tem o request com ID que não existe é tipo simprão de tudo beleza Agora falta a última coisa pra gente
terminar nosso crud do dia que é o end Point de alteração E aí o que que a gente vai fazer a gente tinha visto o outro método de alteração do http né que era o e agora a gente vai usar um outro método que é o Pat e o Pet ele é interessante porque diferente do lembra que uma coisa chata de mandar o é que a gente precisava ficar tipo ah tenho que enviar todos os dados para fazer uma atualização única Então eu queria mudar o e-mail mas aí para mudar o e-mail tenho que mudar
a senha o o id o nome sobrenome telefone nome da mãe lembra tudo isso aí precisava ter mandado no formulário sabe era meio chato fazer então o o ele tem essa necessid de todos os dados terem que ser enviados ao mesmo tempo o funciona assim porque na rfc do você pode usar o como post então é uma coisa que funciona e aí agora a ideia do patch é que a gente possa mandar só o campo que a gente precisa pô vai ter título então a gente manda só o título vai ter o description então a
gente manda só o description vai mudar o state então a gente manda só o state então a gente pode mandar o Jon só com as partes que a gente precisa alterar disso E aí para isso a gente vai criar um novo um novo esquema que é o to do update nesse caso ele não é o mesmo do post né porque agora ele pode ser os Campos São opcionais aqui na hora de enviar então vou copiar isso aqui pra gente lá vamos lá no sk tá aqui então to do update aí como é que a gente
vai usar isso aqui lindo né então ele vai receber o ID de quem vai ser alterado né Igual igual a gente fazer no no delite e tudo mais a gente vai pegar a session o corrente user e a gente vai pegar esse to do update aqui né que é o o dicionário que a gente vai receber que pode vir com os campos ou pode vir sem os campos né então basicamente Essa é a ideia dele aí a gente vai procurar ele no banco né então a session psar então a gente select to do vai selecionar
em todos onde o user ID é igual o corrent user que é quem tá logado E qual é o ID da tarefa se a tarefa não tiver aqui a gente vai dar um Exception not found TK not found to do not found o que você preferir se tiver a gente tem essa expressão aqui eu queria ter conseguido destacar essa linha porque essa linha é uma das Linhas mais bonitas que tem no curso inteiro essa aqui que é tipo ó pega o modelo do tudu o esima faz um dump nele e aí você exclui Quem não
tiver setado Olha como isso é bonito ou seja O que quer dizer o exclude andet todos os dados que não vieram no esquema Ou seja que são n você não vai usar aí ele vai transformar Isso aqui vai pegar chave e valor do dicionário e a gente vai pegar Olha lá no objeto que a gente trouxe do banco de dados essa expressão é muito bonita Então nesse objeto seta o nome do atributo que é a chave do dicionário e o valor do atributo depois disso aqui você dá um AD faz um commit chama refresh e
retorna O Todo essa acho que foi a linha de código mais bonita que eu escrevi no curso inteiro eu gostei de ter escrito essa essa linha aqui e aí o que que a gente vai retornar é um Tod Public basicamente não tem nenhum mistério né é um código relativamente simples aqui né mas essa linha é muito bonita Me orgulho muito dessa linha C O Ian o Ian que falou cara código bonito aí fiquei orgulhoso de ter escrito essa linha de código aqui então vou mandar aqui todo esse Patch e o que que a gente precisa
fazer para isso aqui simplesmente escrever o teste né E aí os testes aqui eles estão divididos em dois né Tem aqu teste de sempre que eu mandar o ID que não existe pra gente cair no not found 404 deixa eu pegar ele aqui esse teste não tem muito mistério né Ele é basicamente aquela assertiva do erro né então tipo assim ah tenta alterar o 10 aí Mandei até um Jon vazio e eu posso mandar um Jon vazio Sem dar 422 por quê Porque tudo é opcional no esquema lembra eu posso mandar ou posso não mandar
nenhum dos Campos ou seja alguém vai fazer a pergunta tipo assim pô mas dá para alterar um registro que não altera nada sim dá porque é tudo opcional n faz parte mas como a gente quer mandar só pro teste um registro que não existe tá tudo certo também vamos rodar o teste aqui ver o que que rola Task Format to do update undefined hum por quê Porque eu não importei isso aqui né lá dos meus esimas então esimas to do a Plate deixa eu dar um Format aqui Class Format para ficar bonitinho Ah então estamos
aqui to do update é o último da lista se tudo der certo Deu passou passei cara eu adoro esse meme Passi E aí ele caiu nessa parte aqui né do not ou seja ele levantou Exception deu erro que é bem tradicional aqui e o outro teste que a gente tem é o teste mesmo que faz a alteração n Então vamos lá esse aqui é mais legal então eu vou trazer ele para cá e a gente discute ele aqui né então vamos ver a gente tem t p então a gente vaiar Daquele mesmo jeito que a
gente tinha feito né chamo Factor com o user ID vai chamar qualquer coisa aqui e a gente vai pegar esse ID alterar ele e falar olha preciso de um ID beleza Qual ID a gente vai usar o ID do to mas de qual to desse aqui ah mas como é que eu não tenho o o ID então refresh para garantir que o vai estar aqui a gente vai falar olha esse é o o campo que a gente quer mudar que é o title Então a gente vai mudar o title para teste Então a gente vai
mandar o authorization token vai ver se deu 200 se deu certo e vai ver se a resposta que veio lá no gizão tinha o título teste se você quiser você pode ver também se tá aqui sei lá o description é igual ao to do description sabe você pode fazer essa validação aqui também toption você poderia fazer também se quisesse validar todos os outros Campos eu vou validar só esse porque é o que faz sentido aqui pra gente nesse momento Task Format Task [Música] test Cadê nosso coverage agora é a hora 100% de cobertura maravilhoso maravilhoso
maravilhoso maravilhoso maravilhoso é isso lindo lindo aí o Ramon perguntou aqui seria interessante testar uma chave para todo tudu que não existe Como assim uma chave para todo tudu que não existe eu não entendi uma chave de um tudu que não existe Ah entendi agora você quer tipo assim ver se vai cair lá mas não não cai né porque tipo assim é a questão do do IF que a gente tem aqui né ele já vai olhar aqui né antes porque ele vai ignorar pelo número né mas você tá dizendo aqui do de cima tipo assim
ah testar um título que não tem nada se você quiser testar um título que não tem nada você pode também o que vai acontecer que ele vai retornar o Ah entendi você quer mandar um campo que não existe não aí ele vai aí a gente vai cair aqui no nesse esqueminha aqui né do esimas o pente vai foi o que o t falou se não tiver title ou description ou state ele vai dar 422 Então a gente vai cair no campo do no no mundo do Idêntica a gente pode até alterar aqui ó mandar sei
lá um batata 1 2 3 e rodar você vai ver que a gente vai cair no ponto aqui né Deixa eu deixar o código aqui para você ver basicamente a gente mandou um batata 1 2 3 e ele passou por que passou porque o pid ignora esse campo se você passa coisas a mais ele Ignora ele não dá 422 Ele simplesmente falou ó esse campo para mim é irrelevante ele não existe dentro do esima Então eu só não vou pegar ele olha que massa se você vier aqui e der um Break Point no end Point
aqui dosus vamos lá aqui ó é no pet que a gente tá mandando eu vou dar um Break Point Break Point o p Dante ele elimina esse campo vamos rodar aqui ó aqui ó a gente tá aqui deixa eu ver o todo tá vendo ele ignorou o campo eu vou atualizar Vamos pro outro teste to do que é o que a gente tá mandando title test aqui aqui ó o p falou ah esse campo aí eu não tenho então não me importa eu tiro ele Esse é o mesmo comportamento que acontece lembra quando a gente
estava discutindo ali o esquema do do deixa eu pegar aqui só para não comitar isso aqui depois lembra quando a gente estava falando dos tudus de resposta que eu falei aqui ó esse objeto aqui tem mais campos né esse objeto ele tem o user ID certo e por que que ele não expõe o user ID porque a gente falou no tio do Public que não vai ter user ID se eu colocasse aqui user underline ID a partir desse momento ele vai enviar isso para lá e aí vai dar erro no teste falou ó tem um
campo que que veio e que não era para vir não aqui ó veio o campo user ID o piden faz a limpa dessas coisas o que daria erro era se você mandasse um campo que tem um valor string e mandasse outra coisa tá ligado Tipo aqui sei lá aqui é string tal tal tal se você mandar um state que não existe ele vai dar erro se você mandar um description que é um número ele vai dar erro se você mandar um title que é uma lista ele vai dar erro então ele vai fazer esse tipo
de validação aqui dentro massa então para fechar aqui a aula de hoje que a gente passou um um pouco do tempo deixa eu agradecer o Ramon ranon desculpa Obrigado tamo junto Espero que ajude de alguma forma Então os exercícios dessa aula são lá dentro do do objeto do banco de dados do todu da tabela eu quero que vocês criem um campo created at e um campo updated at Eu quero saber quando o tudu foi criado e quando ele foi atualizado via Patch lembra updated funk Now a gente já fez isso num outro exercício e eles
T que ser init fals massa vai ter que criar uma nova migração para esses campos sabe então criou uma nova migração dos Campos que não sejam versionados e também vai ter que aplicar essa migração no banco e aí aqui vem o grande pulo vai ter que adicionar os campos created at e updated at no nas saídas dos end points ou seja todo endp que exporta dados as saídas os response models também vão ter o created at e o updated at sacaram o exercício certinho e por último Não esqueça de responder o quiz o quiz o
quiz da aula e mudar isso nos testes também porque vai quebrar tudo exatamente Então é isso vai ter que implementar no teste mas o teste eu já nem boto no exercício porque o teste tem que fazer de qualquer jeito né então vai quebrar tudo mesmo então fico aqui meu comit vou subir isso aqui lá pro repositório E aí vocês pegam lá dão uma brincada quem precisar ver o código que a gente fez aqui tá lá no r massa a gente se vê quinta-feira e quinta-feira a gente vai conversar sobre docker e po a gente vai
começar a dockerizar nossa aplicação Estamos chegando Estamos chegando no Deploy Estamos chegando no Deploy a gente vai fazer o p Vai testar com coner vai doiz Nossa AP criar nosso docker com pos a gente tá quase estamos na reta final esse Essa foi a última aula de código agora vem docker post ci Deploy agora as coisas começam a ficar interessantes bom galera um beijo para vocês Muito obrigado aí pela compania Desculpa ter passado um pouco do horário bastante na verdade a gente se vê quinta-feira Tchauzinho tchau n