diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml index b372ee7..78fffad 100644 --- a/.gitea/workflows/release.yaml +++ b/.gitea/workflows/release.yaml @@ -135,7 +135,7 @@ jobs: - name: Generate Tag Name id: tag - run: echo "TAG=v$(date +'%Y%m%d%H%M%S')" >> $GITEA_ENV + run: echo "TAG=v$(date +'%Y%d%m%H%M%S')" >> $GITEA_ENV - name: Create Release env: @@ -180,6 +180,7 @@ jobs: fi cleanup: + needs: [release] runs-on: ubuntu-latest steps: @@ -192,5 +193,5 @@ jobs: docker images --filter "reference=multiarch/qemu-user-static" -q | xargs -r docker rmi docker images --filter "reference=tonistiigi/binfmt" -q | xargs -r docker rmi docker volume ls --filter "name=buildx" -q | xargs -r docker volume rm - docker images --filter "reference=gitea/runner-images" -q | xargs -r docker rmi - docker volume ls --filter "name=act" -q | xargs -r docker volume rm + #docker images --filter "reference=gitea/runner-images" -q | xargs -r docker rmi + #docker volume ls --filter "name=act" -q | xargs -r docker volume rm diff --git a/tests/test_redis_config.py b/tests/test_redis_config.py index 5e52608..27070b8 100644 --- a/tests/test_redis_config.py +++ b/tests/test_redis_config.py @@ -1,19 +1,19 @@ import sys -import os import pytest -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../app'))) -from redis_config import setup_redis +from redis import from_url, ConnectionPool, Redis @pytest.fixture def app(): from flask import Flask - from config import Config app = Flask(__name__) - app.config.from_object(Config) return app +REDIS_URL="redis://localhost:6379/0" + def test_setup_redis(app): with app.app_context(): - redis_connection = setup_redis(app) + pool = ConnectionPool.from_url(REDIS_URL) + redis_connection = Redis(connection_pool=pool) + redis_connection.ping() assert redis_connection is not None assert redis_connection.ping() is True diff --git a/tests/test_routes.py b/tests/test_routes.py index 832415c..5c87b69 100644 --- a/tests/test_routes.py +++ b/tests/test_routes.py @@ -4,28 +4,49 @@ import pytest from flask import Flask from flask_httpauth import HTTPBasicAuth import base64 +from redis import from_url, ConnectionPool, Redis +from flask_limiter import Limiter +from flask_limiter.util import get_remote_address +from unittest.mock import patch, Mock sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../app'))) -from config import Config from routes import setup_routes -from redis_config import setup_redis -from limiter_config import setup_limiter auth = HTTPBasicAuth() # Force configuration to use fallback values -class TestConfig(Config): - SECRET_KEY = '28c93e98b2a87e47db16372bdb6e7593fb1addf9ccc10eae562827a7358cab3b' -# Adding LAPTOP_MAC environment variable -os.environ['LAPTOP_MAC'] = '00:00:00:00:00:00' -os.environ['LAPTOP_IP'] = '192.168.0.0' +class TestConfig(): + SECRET_KEY = '28c93e98b2a87e47db16372bdb6e7593fb1addf9ccc10eae562827a7358cab3b' + +REDIS_URL="redis://localhost:6379/0" +RATE_LIMITS = ["200 per day", "50 per hour"] + +def setup_redis(app): + pool = ConnectionPool.from_url(REDIS_URL) + redis_connection = Redis(connection_pool=pool) + redis_connection.ping() + app.logger.info("Connected to Redis") + # Return the redis_connection to be used elsewhere + return redis_connection + +def setup_limiter(app): + + # Rate limiter setup + limiter = Limiter( + key_func=get_remote_address, + app=app, + storage_uri=REDIS_URL, + default_limits=RATE_LIMITS + ) + + return limiter @pytest.fixture def app(): app = Flask(__name__) - app.config.from_object(TestConfig) redis_connection = setup_redis(app) + app.config.from_object(TestConfig) setup_routes(setup_limiter(app), app, redis_connection) return app @@ -43,9 +64,28 @@ def auth_headers(): } return headers +def mock_subprocess_run(*args, **kwargs): + """Mock function to simulate subprocess.run behavior.""" + class MockCompletedProcess: + def __init__(self, returncode=0, stdout='', stderr=''): + self.returncode = returncode + self.stdout = stdout + self.stderr = stderr + + if 'ping' in args[0]: + if '192.168.0.0' in args[0]: + # Simulate unreachable IP + return MockCompletedProcess(returncode=1, stderr='Unreachable') + else: + # Simulate reachable IP + return MockCompletedProcess(returncode=0, stdout='Ping successful') + return MockCompletedProcess() + def test_wol_valid_device(client, auth_headers): - response = client.get('/wol/laptop?key=28c93e98b2a87e47db16372bdb6e7593fb1addf9ccc10eae562827a7358cab3b', headers=auth_headers) - assert response.status_code == 200 + with patch.dict(os.environ, {'LAPTOP_MAC': '00:00:00:00:00:00', 'LAPTOP_IP': '192.168.0.1'}): + with patch('subprocess.run', mock_subprocess_run): + response = client.get('/wol/laptop?key=28c93e98b2a87e47db16372bdb6e7593fb1addf9ccc10eae562827a7358cab3b', headers=auth_headers) + assert response.status_code == 200 def test_unauthorized_wol(client): response = client.get('/wol/device1?key=wrongkey')