Adiciona testes do conector com fixtures offline
Cobre o caminho completo sem depender da VPS estar no ar: cifra com uma chave de teste descartavel, troca a chave do app por monkeypatch e exercita a rota. 8 casos: recusa sem token e com token errado; caminho feliz; envelope adulterado (o GCM tem que estourar, nao passar); cifrado com outra chave; payload fora do contrato (422, nao 200 nem 500); e dois travando o contrato com a API da VPS — se o PayloadCompras dos dois lados divergir, quebra aqui em vez de em producao. Fixtures em tests/fixtures/: par de chaves so pra teste, o payload real do Holmes e o payload ja tratado. O .gitignore abre excecao estreita pra tests/fixtures/*.pem — chave real continua barrada. Tambem: - 422 passa a usar HTTP_422_UNPROCESSABLE_CONTENT (o _ENTITY deprecou) - app/services/holmes.py removido: o conector nao fala com o Holmes - app/utils/cesar.py entra como veio Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
f902ccbecb
commit
7a9b0f8aa5
9 changed files with 283 additions and 705 deletions
41
app/utils/cesar.py
Normal file
41
app/utils/cesar.py
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
"""Cifra de Cesar para criptografar/descriptografar senhas."""
|
||||
|
||||
import sys
|
||||
|
||||
|
||||
def caesar_encrypt(text: str, shift: int) -> str:
|
||||
result = []
|
||||
for char in text:
|
||||
if char.isalpha():
|
||||
base = ord("A") if char.isupper() else ord("a")
|
||||
result.append(chr((ord(char) - base + shift) % 26 + base))
|
||||
elif char.isdigit():
|
||||
result.append(str((int(char) + shift) % 10))
|
||||
else:
|
||||
result.append(char)
|
||||
return "".join(result)
|
||||
|
||||
|
||||
def caesar_decrypt(text: str, shift: int) -> str:
|
||||
return caesar_encrypt(text, -shift)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) < 4:
|
||||
print("Uso: python cezar.py <encript|decript> <deslocamento> <texto> [texto2 ...]")
|
||||
print("Exemplo: python cezar.py encript 12 minha_senha outra_senha")
|
||||
sys.exit(1)
|
||||
|
||||
modo = sys.argv[1].lower()
|
||||
shift = int(sys.argv[2])
|
||||
textos = sys.argv[3:]
|
||||
|
||||
if modo == "encript":
|
||||
for i, texto in enumerate(textos, start=1):
|
||||
print(f"texto_criptografado{i}: {caesar_encrypt(texto, shift)}")
|
||||
elif modo == "decript":
|
||||
for i, texto in enumerate(textos, start=1):
|
||||
print(f"texto_descriptografado{i}: {caesar_decrypt(texto, shift)}")
|
||||
else:
|
||||
print("Modo inválido. Use 'encript' ou 'decript'.")
|
||||
sys.exit(1)
|
||||
Loading…
Add table
Add a link
Reference in a new issue