From b60a9a1a46ece25f8345ca05197c2fe73fa991cb Mon Sep 17 00:00:00 2001 From: crb623 Date: Mon, 29 Apr 2024 08:58:31 -0400 Subject: [PATCH] test --- tests/web_app_tests.py | 132 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/tests/web_app_tests.py b/tests/web_app_tests.py index 18c8566..49cf61e 100644 --- a/tests/web_app_tests.py +++ b/tests/web_app_tests.py @@ -1,2 +1,134 @@ ## place pytests here + +import pytest +from web_app.app import app as flask_app +from unittest.mock import patch, MagicMock +from pymongo import MongoClient +import bcrypt + +@pytest.fixture +def app(): + flask_app.config.update({ + "TESTING": True, + "MONGO_URI": "mongodb://localhost:27017/test_database" + }) + return flask_app + +@pytest.fixture +def client(app): + return app.test_client() + +@pytest.fixture +def runner(app): + return app.test_cli_runner() + +# Mocking the database connection +@pytest.fixture +def mock_mongo_client(monkeypatch): + class FakeMongoClient: + def __init__(self, uri): + pass + + def __getitem__(self, name): + return FakeDatabase() + + class FakeDatabase: + def __getitem__(self, name): + return FakeCollection() + + class FakeCollection: + def find_one(self, query): + if query.get("username") == "johndoe": + return {"username": "johndoe", "password": "hashed_password"} + return None + + def insert_one(self, user): + return + + monkeypatch.setattr(MongoClient, '__init__', FakeMongoClient.__init__) + monkeypatch.setattr(MongoClient, '__getitem__', FakeMongoClient.__getitem__) + +# Tests for user registration +def test_register_new_user(client, mocker): + mocker.patch('bcrypt.hashpw', return_value=b'hashed_password') + response = client.post('/register', data={ + 'name': 'John Doe', + 'username': 'newuser', + 'password': 'securepassword' + }) + assert response.status_code == 200 + + +def test_register_existing_user(client, mocker): + mocker.patch('pymongo.collection.Collection.find_one', return_value={'username': 'johndoe'}) + response = client.post('/register', data={ + 'name': 'John Doe', + 'username': 'johndoe', + 'password': 'securepassword' + }) + assert response.status_code == 200 + + +# Tests for user login +def test_login_success(client, mocker): + mocker.patch('bcrypt.checkpw', return_value=True) + mocker.patch('pymongo.collection.Collection.find_one', return_value={'username': 'johndoe', 'password': 'hashed_password'}) + response = client.post('/login', data={'username': 'johndoe', 'password': 'securepassword'}) + assert response.status_code == 404 + +def test_login_failure(client, mocker): + mocker.patch('pymongo.collection.Collection.find_one', return_value=None) + response = client.post('/login', data={'username': 'wronguser', 'password': 'wrongpassword'}) + assert response.status_code == 404 + +# Test for user logout +def test_logout(client): + with client: + client.post('/login', data={'username': 'johndoe', 'password': 'securepassword'}) + client.get('/logout') + response = client.get('/home') + assert response.status_code == 302 + +# Mock the external API call for finding coffee shops +def test_find_coffee_shops(client): + with patch('requests.post') as mock_post: + mock_post.return_value.status_code = 200 + mock_post.return_value.json.return_value = {"cafes": [{"name": "Best Coffee", "location": "Downtown"}]} + response = client.post("/find_coffee_shops", json={"latitude": 40.7128, "longitude": -74.0060}) + assert response.status_code == 200 + assert "Best Coffee" in response.data.decode() + + +def test_home_access_when_logged_in(client, mocker): + with client.session_transaction() as sess: + sess['username'] = 'johndoe' + response = client.get('/home') + assert response.status_code == 200 + +# Test rendering of the login page +def test_get_login_page(client): + response = client.get('/') + assert response.status_code == 200 + +# Test rendering of the registration page +def test_get_register_page(client): + response = client.get('/register') + assert response.status_code == 200 + +# Test rendering of the home page +def test_get_home_page(client): + response = client.get('/home') + assert response.status_code == 302 + +# Test rendering of the find coffee shops page +def test_get_coffee_page(client): + response = client.get('/find_coffee_shops') + assert response.status_code == 405 + +def test_login_incorrect_password(client, mocker): + mocker.patch('pymongo.collection.Collection.find_one', return_value={'username': 'johndoe', 'password': bcrypt.hashpw('real_password'.encode('utf-8'), bcrypt.gensalt())}) + mocker.patch('bcrypt.checkpw', return_value=False) + response = client.post('/', data={'username': 'johndoe', 'password': 'wrong_password'}) + assert response.status_code == 200 +