{"id":16112862,"url":"https://github.com/jonathanmdr/shopping-cart-tdd","last_synced_at":"2025-04-06T07:23:02.604Z","repository":{"id":55916649,"uuid":"296032490","full_name":"jonathanmdr/Shopping-Cart-TDD","owner":"jonathanmdr","description":"Exercise with test-oriented development practices!","archived":false,"fork":false,"pushed_at":"2021-01-24T01:26:20.000Z","size":27,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-12T12:55:33.744Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonathanmdr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-09-16T12:55:44.000Z","updated_at":"2021-01-24T01:26:22.000Z","dependencies_parsed_at":"2022-08-15T09:20:45.584Z","dependency_job_id":null,"html_url":"https://github.com/jonathanmdr/Shopping-Cart-TDD","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanmdr%2FShopping-Cart-TDD","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanmdr%2FShopping-Cart-TDD/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanmdr%2FShopping-Cart-TDD/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanmdr%2FShopping-Cart-TDD/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonathanmdr","download_url":"https://codeload.github.com/jonathanmdr/Shopping-Cart-TDD/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247446704,"owners_count":20940163,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-09T20:09:28.535Z","updated_at":"2025-04-06T07:23:02.581Z","avatar_url":"https://github.com/jonathanmdr.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Shopping-Cart-TDD\nExercise with test-oriented development practices!\n\nUtilizando TDD para desenvolvimento de software, exemplos de como realizar a cobertura da aplicação com testes automatizados utilizando JUnit e Mockito, junto com eles exploramos um pouco do Lombok para reduzir o Boilerplate Code.\n\n## Continuous Integration\n![Java CI with Maven](https://github.com/jonathanmdr/Shopping-Cart-TDD/workflows/Java%20CI%20with%20Maven/badge.svg)\n\n## Exercício - Cálculo de Frete\nEm todos os e-commerces, o usuário pode criar um carrinho de compras, adicionar um produto e calcular o valor do frete para a entrega. \u003c/br\u003e\nO valor do frete é calculado a partir do CEP do usuario (destinatário), e geralmente é provido pelos serviços de fretamento (correios ou particular), muitas vezes sendo invocado uma API que, dado o CEP (dentre outros dados), traz o valor do frete.\n\n#### Desenvolva um sistema simplificado do carrinho, com os seguintes requisitos: \u003c/br\u003e\n - Um produto possui um nome e um valor \u003c/br\u003e\n - Um carrinho recebe um conjunto de produtos e a quantidade de itens de cada produto \u003c/br\u003e\n - Um carrinho pertence à um usuário, que tem nome e seu endereço de entrega representado por um CEP \u003c/br\u003e\n - Um serviço que recebe o carrinho, e retorna o valor final para o usuário\n\n#### Este serviço:\n - Faz a soma total de valores de todos os produtos do carrinho \u003c/br\u003e\n - Caso o valor seja \u003c $100,00, o sistema requisita para um serviço externo o valor do frete de acordo com o CEP do dono do carrinho \u003c/br\u003e\n - Retorna o valor final do carrinho (com ou sem frete)\n\n#### Sugestão de solução:\nCrie a estrutura necessária para o Carrinho \u003c/br\u003e\n - Usuario (nome e CEP) \u003c/br\u003e\n - Produto (nome e Valor) \u003c/br\u003e\n - Carrinho (Usuario)\n\n#### Faça o carrinho responder o valor total das compras - com testes\nPergunte-se: \u003c/br\u003e\n - Qual o valor se ele estiver vazio? \u003c/br\u003e\n - E se eu adicionar novos produtos? \u003c/br\u003e\n - E se eu adicionar produtos que já tinham sido adicionados? \u003c/br\u003e\n - E como eu removo o produto do carrinho? \u003c/br\u003e\n - E se eu adicionar dois produtos ao mesmo tempo? \u003c/br\u003e\n - E se eu adicionar ou remover a quantidade de produtos no carrinho? \u003c/br\u003e\n - E se eu zerar a quantidade de produtos do carrinho? \u003c/br\u003e\n - Não há requisitos formais de como um carrinho deve funcionar, ou suas interfaces \u003c/br\u003e\n - O carrinho deve ter um método final, que retorne o valor total do carrinho\n\n#### Criem uma interface que representará o Serviço do Correios \u003c/br\u003e\n - Ele terá apenas um método registrado - recebe o CEP e retorna um valor de Frete \u003c/br\u003e\n - Não precisamos da implementação real (no momento, e para esse exercício)\n\n#### Crie um classe que representará o serviço de cálculo \u003c/br\u003e\n - Ela receberá em sua construção uma instância da interface do serviço de Correios (injeção de dependência) \u003c/br\u003e\n - Ela terá um método que recebe um carrinho como parâmetro, e retorna o valor total \u003c/br\u003e\n\n#### Crie os testes antes da implementação \u003c/br\u003e\n - Qual o valor total, caso a soma total dos produtos do carrinho (feito anteriormente e com seus testes já funcionando) seja\u003c $100? \u003c/br\u003e\n - Eu preciso invocar o método real do Carrinho? \u003c/br\u003e\n - Como eu simulo o retorno do serviço do Correios? \u003c/br\u003e\n - Como eu garanto que a lógica decisória está correta? \u003c/br\u003e\n - Como eu garanto que eu chamei apenas uma única vez o serviço do correio? \u003c/br\u003e\n - E se o valor for \u003e= $100? \u003c/br\u003e\n - Qual será o valor final do cálculo? \u003c/br\u003e\n - Como eu garanto que eu não precisei chamar os serviços do correio?\n\n#### Crie os testes usando Mocks, mockando tanto o Carrinho quanto o Serviço de Correios \u003c/br\u003e\n - A implementação do serviço que calcula valor total com ou sem frete deve ser concreta\n\n\n#### Definition of Done\nTodos os requisitos devem estar cobertos por testes automatizados. \u003c/br\u003e\nDeve existir pelo menos uma classe de testes para o serviço, e esse deverá cobrir todas as variações das regras do serviço. Além do mais, a comunicação com o serviço do correio deverá ser através de mocks.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanmdr%2Fshopping-cart-tdd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonathanmdr%2Fshopping-cart-tdd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanmdr%2Fshopping-cart-tdd/lists"}