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('