{"id":31702081,"url":"https://github.com/instruct-br/teste-python-jr-remoto-2021-06","last_synced_at":"2025-10-08T21:11:35.592Z","repository":{"id":47341997,"uuid":"377916370","full_name":"instruct-br/teste-python-jr-remoto-2021-06","owner":"instruct-br","description":"Teste técnico para a vaga remota de Dev Python Jr da Instruct","archived":false,"fork":false,"pushed_at":"2021-09-02T13:08:30.000Z","size":75,"stargazers_count":17,"open_issues_count":0,"forks_count":27,"subscribers_count":11,"default_branch":"main","last_synced_at":"2023-03-07T14:48:07.730Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":false,"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/instruct-br.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":"2021-06-17T17:48:46.000Z","updated_at":"2023-02-06T22:12:43.000Z","dependencies_parsed_at":"2022-08-27T23:10:14.186Z","dependency_job_id":null,"html_url":"https://github.com/instruct-br/teste-python-jr-remoto-2021-06","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/instruct-br/teste-python-jr-remoto-2021-06","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/instruct-br%2Fteste-python-jr-remoto-2021-06","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/instruct-br%2Fteste-python-jr-remoto-2021-06/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/instruct-br%2Fteste-python-jr-remoto-2021-06/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/instruct-br%2Fteste-python-jr-remoto-2021-06/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/instruct-br","download_url":"https://codeload.github.com/instruct-br/teste-python-jr-remoto-2021-06/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/instruct-br%2Fteste-python-jr-remoto-2021-06/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000717,"owners_count":26082837,"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","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":"2025-10-08T21:11:28.501Z","updated_at":"2025-10-08T21:11:35.585Z","avatar_url":"https://github.com/instruct-br.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Teste Técnico Desenvolvedor(a) Python Júnior [REMOTO]\n\nNeste repositório você encontra o enunciado do teste técnico para a vaga de\n_Desenvolvedor(a) Python Júnior [REMOTO]_ da \n[Instruct](https://instruct.com.br/)! Você provavelmente chegou aqui através da \nindicação de alguma pessoa da empresa após passar pelas \n[outras etapas](https://instruct.com.br/trabalhe-com-a-gente/processo-de-selecao/)\ndo processo seletivo. Se este não for o seu caso e mesmo assim você implementar\nalguma solução para este exercício ele **não** será avaliado.\n\n\u003e Você _pode_ usar o problema descrito aqui para exercitar suas habilidades de\n\u003e desenvolvimento, mas a sua solução será avaliada por alguém da Instruct\n\u003e **apenas se** você estiver no processo seletivo da vaga de _Desenvolvedor(a) \n\u003e Python Júnior [REMOTO]_.\n\nPara saber mais sobre a empresa, leia o [FAQ](#FAQ)\n\n## O problema\n\nA equipe de desenvolvimento _Bleeding Edge Enthusiasts_ (BEE) se orgulha de \nusar as tecnologias mais recentes e modernas. Essa regra também se aplica aos\nprojetos desenvolvidos em Python pela equipe BEE.\n\nPara garantir que todos seus projetos em Python estão usando as últimas versões\ndisponíves dos pacotes, a equipe pensou em criar uma ferramenta batizada de \nMagPy. A ferramenta recebe um nome de projeto, uma lista de pacotes e devolve a \núltima versão de cada pacote.\n\nUm dos integrantes da BEE apontou que a \n[API pública do PyPI](https://warehouse.readthedocs.io/api-reference/json.html)\npoderia ser usada para esse fim.\n\n## Solução\n\nVocê deve desenvolver a MagPy, uma API REST que gerencia uma coleção de \nprojetos. Cada projeto tem um nome e uma lista de pacotes. Cada pacote tem um \nnome e uma versão.\n\nO cadastro de um projeto recebe o nome e a lista de pacotes. Cada pacote da \nlista precisa obrigatoriamente especificar um nome, mas a versão é opcional.\n\nSua API deve validar o projeto cadastrado: todos os pacotes informados devem\nestar cadastrados no [PyPI](https://pypi.org/). Portanto você deve verificar o\nnome e a versão do pacote.\n\nQuando o pacote vem apenas com o nome, sua API deve assumir que é preciso usar\na última versão publicada no [PyPI](https://pypi.org/).\n\nAbaixo, alguns exemplos de chamadas que serão feitas nessa API:\n\n```\nPOST /api/projects\n{\n    \"name\": \"titan\",\n    \"packages\": [\n        {\"name\": \"Django\"},\n        {\"name\": \"graphene\", \"version\": \"2.0\"}\n    ]\n}\n```\nO código HTTP de retorno deve ser 201 e o corpo esperado na resposta é:\n```\n{\n    \"name\": \"titan\",\n    \"packages\": [\n        {\"name\": \"Django\", \"version\": \"3.2.5\"},  // Usou a versão mais recente\n        {\"name\": \"graphene\", \"version\": \"2.0\"}   // Manteve a versão especificada\n    ]\n}\n```\n\nSe um dos pacotes informados não existir, ou uma das versões especificadas for\ninválida, um erro deve ser retornado.\n\nPara uma chamada semelhante ao exemplo abaixo:\n```\nPOST /api/projects\n{\n    \"name\": \"titan\",\n    \"packages\": [\n        {\"name\": \"pypypypypypypypypypypy\"},\n        {\"name\": \"graphene\", \"version\": \"1900\"}\n    ]\n}\n```\nO código HTTP de retorno deve ser 400 e o corpo esperado na resposta é:\n```\n{\n    \"error\": \"One or more packages doesn't exist\"\n}\n```\n\nTambém deve ser possível visitar projetos previamente cadastrados, usando o\nnome na URL:\n```\nGET /api/projects/titan\n{\n    \"name\": \"titan\",\n    \"packages\": [\n        {\"name\": \"Django\", \"version\": \"3.2.5\"},\n        {\"name\": \"graphene\", \"version\": \"2.0\"}\n    ]\n}\n```\n\nE deletar projetos pelo nome:\n```\nDELETE /api/projects/titan\n```\n\n| ⚠️ | Sua solução deve usar a [API pública do PyPI](https://warehouse.readthedocs.io/api-reference/json.html). Não use outro caminho pra buscar as informações necessárias |\n| --- | --- |\n\n\n## Esqueleto\n\nEste repositório vem com três esqueletos para iniciar o projeto. Eles já tem \nalgumas partes implementadas e estão prontos para o deploy na \n[Heroku](https://www.heroku.com/).\n\nConforme detalhado na próxima seção deste README, nós iremos avaliar a sua API\npublicada nessa plataforma, então é recomendado que você use uma dessas opções \ncomo base para a sua solução. \n\nAs opções disponíves estão nas respectivas pastas:\n- template-django: esqueleto com Django e Django Rest Framework\n- template-fastapi: esqueleto com FastAPI e SQLAlchemy\n- template-flask: esqueleto com Flask e SQLAlchemy\n\nVocê pode usar outro framework web desde que sua solução use Python. No entanto\na configuração do projeto para o deploy será responsabilidade sua. Se você \nnunca mexeu com nenhuma dessas opções, a recomendação é usar o template-django.\nFique à vontade para fazer as alterações que julgar necessárias no código\ndisponibilizado.\n\nPara usar uma dessas bases, você precisará:\n\n1. Fazer uma cópia da pasta\n2. Iniciar um repositório git nessa pasta\n3. Implementar sua solução\n4. Criar uma conta gratuita no Heroku\n5. Criar um novo app\n6. Seguir as instruções da seção _Deploy using Heroku Git_\n7. Adicionar o usuário `jobs@instruct.com.br` como colaborador do app\n\n## Avaliação\n\nNum primeiro momento não olharemos o seu código. O projeto será testado de \nforma automatizada pra checar se implementa a API especificada acima.\n\nVocê deve codificar seu projeto em Python e fazer deploy usando os recursos \ndisponibilizados nos _Frees Tiers_ da [Heroku](https://www.heroku.com/).\n\nQuando finalizar a implementação, adicione o usuário com e-mail\n`jobs@instruct.com.br` como colaborador do app publicado até o fim do prazo\nestipulado. Isso nos garante acesso ao endereço em que sua API está publicada,\npara seguir com os testes automatizados.\n\n| ⚠️ | Você deve adicionar o usuário com e-mail `jobs@instruct.com.br` no app publicado no Heroku! Não é necessário adicionar acesso ao código fonte num repositório do GitHub. |\n| --- | --- |\n\nNós executaremos dois conjuntos de testes na sua API:\n\n1. Testes básicos (abertos)\n2. Testes avançados (fechados)\n\nSe a API não passar nos testes básicos, faremos mais duas tentativas. Se\nmesmo assim ela não passar nos testes básicos nós encerramos os testes.\n\nSe a API passar nos testes básicos e não passar nos testes avançados, faremos\nmais duas tentativas. Se mesmo assim ela não passar nos testes avançados nós\nencerramos os testes.\n\nSe a API passar pelos testes avançados nós conferimos superficialmente o seu \ncódigo para identificar problemas; no entanto você provavelmente já garantiu a \nsua participação na próxima etapa.\n\nOs testes básicos estão disponíveis neste repositório no arquivo\n`tests-open.js`. Use-os durante o desenvolvimento para avaliar se a sua API \nestá correta. Como explicado acima, você **não passará** para a próxima etapa \nse a sua solução não atender todos os testes desse arquivo. \n**Use os testes para guiar o desenvolvimento da solução.**\n\nVocê pode executar esses testes com o [k6](https://k6.io/). Para instalar o k6\nbasta [baixar o binário](https://github.com/loadimpact/k6/releases) para o seu\nsistema operacional (Windows, Linux ou Mac).\n\nPara rodar os testes abertos, especifique a variável de ambiente \"API_BASE\"\ncom o endereço base da API testada.\n\nExemplo de aplicação rodando no localhost na porta 8080:\n```\nk6 run -e API_BASE='http://localhost:8080/' tests-open.js\n```\n\n## Recomendações finais\n\n- Não deixe para fazer na última hora\n- [Não teste apenas o _Happy Path_](https://cucumber.io/blog/test-automation/happy-unhappy-paths-why-you-need-to-test-both/)\n\n**Boa sorte!**\n\n---\n\n## FAQ\n\n### Como me candidatar para trabalhar na Instruct?\n\nAs inscrições são feitas através das vagas publicadas no site: https://instruct.com.br/trabalhe-com-a-gente/\n\nNessa página estão listadas as vagas abertas e todos os detalhes de nosso\nprocesso seletivo.\n\n### Como ser avisado de novas vagas?\n\n[Siga a Instruct no Linkedin](https://www.linkedin.com/company/instructbr).\n\nSempre publicamos quando novas vagas são abertas.\n\n### Como é trabalhar na Instruct?\n\nVocê pode ler nosso [Handbook](https://github.com/instruct-br/handbook). Ele é a referência completa sobre como a Instruct funciona.\n\nDestaque especial para as atribuições do papel de [Analista de Desenvolvimento Júnior](https://github.com/instruct-br/handbook/blob/main/papeis.md#analista-de-desenvolvimento-j%C3%BAnior)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finstruct-br%2Fteste-python-jr-remoto-2021-06","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finstruct-br%2Fteste-python-jr-remoto-2021-06","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finstruct-br%2Fteste-python-jr-remoto-2021-06/lists"}