diff --git a/CHANGELOG.md b/CHANGELOG.md index 34f34ab..8d83e9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,24 @@ All notable changes to GitHub Devwatch will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.0.2] - 2025-11-19 + +### Fixed +- Fixed test failures in popup repository controller due to Chrome storage API mocks using callback-based API instead of promise-based +- Fixed lint warnings for unused variables in test files + +### Changed +- Expanded test coverage from ~40% to 47% line coverage +- Added comprehensive tests for background service worker message handlers +- Added tests for rate limiting and storage quota handling +- Added tests for badge expiry filtering +- Added tests for token validation edge cases +- Added animation timing tests using Jest fake timers +- Updated Jest coverage thresholds and collection patterns + +### Added +- New test files for notification manager, theme controller, activity list view, and repository list view + ## [1.0.1] - 2025-11-19 ### Fixed diff --git a/jest.config.js b/jest.config.js index 3e56f52..b575372 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,19 +2,23 @@ export default { testEnvironment: 'jsdom', testMatch: ['**/tests/**/*.test.js'], collectCoverageFrom: [ + 'background.js', 'popup/*.js', 'popup/controllers/*.js', + 'popup/views/*.js', 'options/*.js', 'options/controllers/*.js', + 'options/views/*.js', 'shared/*.js', 'shared/api/*.js', + 'shared/ui/*.js', '!**/*.test.js' ], coverageThreshold: { global: { - branches: 45, - functions: 40, - lines: 50 + branches: 46, + functions: 44, + lines: 47 } }, transform: {}, diff --git a/manifest.json b/manifest.json index e5b9c8a..f0f5cc0 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "GitHub Devwatch", - "version": "1.0.0", + "version": "1.0.2", "description": "Monitor pull requests, issues, and releases across multiple GitHub repositories. Get notifications and never miss activity.", "author": "Jonathan Martinez", "permissions": [ diff --git a/package.json b/package.json index 3997e0a..5207d48 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "github-devwatch-chrome", - "version": "1.0.0", + "version": "1.0.2", "description": "Chrome extension for GitHub Devwatch", "type": "module", "scripts": { diff --git a/shared/ui/notification-manager.js b/shared/ui/notification-manager.js index e63eb8f..19e251a 100644 --- a/shared/ui/notification-manager.js +++ b/shared/ui/notification-manager.js @@ -1,8 +1,7 @@ -import { escapeHtml } from '../sanitize.js'; - /** * Toast Notification Manager * Singleton class for managing toast notifications across the application + * Note: Using textContent for text insertion provides automatic XSS protection */ class NotificationManager { constructor() { @@ -67,30 +66,50 @@ class NotificationManager { const icon = this.getIcon(type); - let toastHTML = ` -
${icon}
-
${escapeHtml(message)}
- -
- `; + // Build toast structure + const toastIcon = document.createElement('div'); + toastIcon.className = 'toast-icon'; + toastIcon.textContent = icon; + + const toastMessage = document.createElement('div'); + toastMessage.className = 'toast-message'; + toastMessage.textContent = message; + + const closeBtn = document.createElement('button'); + closeBtn.className = 'toast-close'; + closeBtn.setAttribute('aria-label', 'Close toast'); + closeBtn.textContent = '✕'; + + const progressBar = document.createElement('div'); + progressBar.className = 'toast-progress'; + // Append elements in order + toast.appendChild(toastIcon); + toast.appendChild(toastMessage); + + // Add action button if provided if (action) { - const actionButton = ``; - toastHTML = toastHTML.replace('