diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index c421243..7211c7f 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -31,15 +31,11 @@ jobs: with: fetch-depth: 1 - - name: Setup GitHub App Token - uses: anthropics/claude-code-action@v1 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - - name: Run Claude Code Review id: claude-review uses: anthropics/claude-code-action@v1 with: + github_token: ${{ secrets.GITHUB_TOKEN }} claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} prompt: | Please review this pull request and provide feedback on: diff --git a/techblog_cms/settings.py b/techblog_cms/settings.py index a2644e7..17042ed 100644 --- a/techblog_cms/settings.py +++ b/techblog_cms/settings.py @@ -8,6 +8,13 @@ # Set up logging logger = logging.getLogger(__name__) +# Detect testing mode early so dependent settings can branch consistently. +IS_TESTING = ( + os.environ.get('TESTING') == 'True' + or 'PYTEST_CURRENT_TEST' in os.environ + or any(name.endswith('pytest') for name in sys.modules) +) + # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -76,46 +83,53 @@ WSGI_APPLICATION = 'techblog_cms.wsgi.application' -# Database -# Database -# Prefer DATABASE_URL when provided (12factor style) -db_url = os.environ.get('DATABASE_URL') -if db_url: - parsed = urlparse(db_url) - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql', - 'NAME': parsed.path.lstrip('/') or os.environ.get('APP_DB_NAME') or os.environ.get('POSTGRES_DB', 'techblogdb'), - 'USER': unquote(parsed.username or os.environ.get('APP_DB_USER') or os.environ.get('POSTGRES_USER', 'techblog')), - 'PASSWORD': unquote(parsed.password or os.environ.get('APP_DB_PASSWORD') or os.environ.get('POSTGRES_PASSWORD', 'techblogpass')), - 'HOST': parsed.hostname or os.environ.get('POSTGRES_HOST', 'db'), - 'PORT': str(parsed.port or os.environ.get('POSTGRES_PORT', '5432')), - } - } -elif os.environ.get('APP_DB_USER') or os.environ.get('APP_DB_NAME') or os.environ.get('APP_DB_PASSWORD'): - # Next preference: dedicated app credentials if provided +if IS_TESTING: + # Unit tests use an in-memory SQLite database to avoid external service dependencies. DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.postgresql', - 'NAME': os.environ.get('APP_DB_NAME', os.environ.get('POSTGRES_DB', 'techblogdb')), - 'USER': os.environ.get('APP_DB_USER', os.environ.get('POSTGRES_USER', 'techblog')), - 'PASSWORD': os.environ.get('APP_DB_PASSWORD', os.environ.get('POSTGRES_PASSWORD', 'techblogpass')), - 'HOST': os.environ.get('POSTGRES_HOST', 'db'), - 'PORT': os.environ.get('POSTGRES_PORT', '5432'), + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': ':memory:', } } else: - # Fallback to generic POSTGRES_* variables - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql', - 'NAME': os.environ.get('POSTGRES_DB', 'techblogdb'), - 'USER': os.environ.get('POSTGRES_USER', 'techblog'), - 'PASSWORD': os.environ.get('POSTGRES_PASSWORD', 'techblogpass'), - 'HOST': os.environ.get('POSTGRES_HOST', 'db'), - 'PORT': os.environ.get('POSTGRES_PORT', '5432'), + # Prefer DATABASE_URL when provided (12factor style) + db_url = os.environ.get('DATABASE_URL') + if db_url: + parsed = urlparse(db_url) + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': parsed.path.lstrip('/') or os.environ.get('APP_DB_NAME') or os.environ.get('POSTGRES_DB', 'techblogdb'), + 'USER': unquote(parsed.username or os.environ.get('APP_DB_USER') or os.environ.get('POSTGRES_USER', 'techblog')), + 'PASSWORD': unquote(parsed.password or os.environ.get('APP_DB_PASSWORD') or os.environ.get('POSTGRES_PASSWORD', 'techblogpass')), + 'HOST': parsed.hostname or os.environ.get('POSTGRES_HOST', 'db'), + 'PORT': str(parsed.port or os.environ.get('POSTGRES_PORT', '5432')), + } + } + elif os.environ.get('APP_DB_USER') or os.environ.get('APP_DB_NAME') or os.environ.get('APP_DB_PASSWORD'): + # Next preference: dedicated app credentials if provided + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': os.environ.get('APP_DB_NAME', os.environ.get('POSTGRES_DB', 'techblogdb')), + 'USER': os.environ.get('APP_DB_USER', os.environ.get('POSTGRES_USER', 'techblog')), + 'PASSWORD': os.environ.get('APP_DB_PASSWORD', os.environ.get('POSTGRES_PASSWORD', 'techblogpass')), + 'HOST': os.environ.get('POSTGRES_HOST', 'db'), + 'PORT': os.environ.get('POSTGRES_PORT', '5432'), + } + } + else: + # Fallback to generic POSTGRES_* variables + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': os.environ.get('POSTGRES_DB', 'techblogdb'), + 'USER': os.environ.get('POSTGRES_USER', 'techblog'), + 'PASSWORD': os.environ.get('POSTGRES_PASSWORD', 'techblogpass'), + 'HOST': os.environ.get('POSTGRES_HOST', 'db'), + 'PORT': os.environ.get('POSTGRES_PORT', '5432'), + } } - } # Static files (CSS, JavaScript, Images) # NOTE: Must start with a leading slash to avoid relative URLs like diff --git a/techblog_cms/templates/login.html b/techblog_cms/templates/login.html index 178421f..affefb8 100644 --- a/techblog_cms/templates/login.html +++ b/techblog_cms/templates/login.html @@ -8,7 +8,9 @@