Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 20 additions & 6 deletions docs/__tests__/critical-features.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,12 @@ const Analytics = {
const ErrorHandler = {
handle(error, context = 'Unknown') {
console.error(`[${context}]`, error);
Analytics.track('Error', context, error.message);
try {
Analytics.track('Error', context, error.message);
} catch (trackingError) {
// Ignore tracking errors to prevent infinite loops
console.warn('Failed to track error in analytics:', trackingError.message);
}
return null;
},

Expand Down Expand Up @@ -338,11 +343,23 @@ describe('Input Validation & Sanitization', () => {
});

describe('Error Handling', () => {
let originalSetItem;

beforeEach(() => {
// Save the original implementation before each test
originalSetItem = global.localStorage.setItem;
});

afterEach(() => {
// Restore after each test
if (originalSetItem) {
global.localStorage.setItem = originalSetItem;
}
});

test('should handle database errors gracefully', () => {
// Simulate localStorage failure
const originalSetItem = Storage.prototype.setItem;
Storage.prototype.setItem = () => {
global.localStorage.setItem = () => {
throw new Error('QuotaExceededError');
};

Expand All @@ -351,9 +368,6 @@ describe('Error Handling', () => {
localStorage.setItem('test', 'data');
}, 'Database')();
}).not.toThrow();

// Restore
Storage.prototype.setItem = originalSetItem;
});

test('should track errors in analytics', () => {
Expand Down
41 changes: 35 additions & 6 deletions medication-tracker.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,28 @@ const EnhancedMedicationManager = require('./enhanced-medication-manager');
const MedicationValidator = require('./medication-validator');

// Pregnancy Safety Integration - Import as modules, not classes
const PregnancySafetyEngine = require('bumpie-meds/src/services/pregnancy-safety-engine');
const PregnancyInteractionChecker = require('bumpie-meds/src/services/pregnancy-interaction-checker');
const PregnancyRiskCalculator = require('bumpie-meds/src/services/pregnancy-risk-calculator');
const PregnancyAuditLogger = require('bumpie-meds/src/services/pregnancy-audit-logger');
// These modules are optional dependencies
let PregnancySafetyEngine = null;
let PregnancyInteractionChecker = null;
let PregnancyRiskCalculator = null;
let PregnancyAuditLogger = null;

try {
PregnancySafetyEngine = require('bumpie-meds/src/services/pregnancy-safety-engine');
PregnancyInteractionChecker = require('bumpie-meds/src/services/pregnancy-interaction-checker');
PregnancyRiskCalculator = require('bumpie-meds/src/services/pregnancy-risk-calculator');
PregnancyAuditLogger = require('bumpie-meds/src/services/pregnancy-audit-logger');
} catch (error) {
// Only suppress MODULE_NOT_FOUND errors; re-throw other errors like syntax errors
if (error.code === 'MODULE_NOT_FOUND') {
console.warn('⚠️ Warning: bumpie-meds pregnancy safety modules not available.');
console.warn(' Pregnancy safety features will be disabled.');
console.warn(' To enable these features, install the bumpie-meds package.');
Comment on lines +23 to +27

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Re-throw MODULE_NOT_FOUND from non-optional deps

Because the catch treats any MODULE_NOT_FOUND as “optional dependency missing,” a broken install of bumpie-meds (e.g., a missing transitive dependency or a renamed internal file) will be silently swallowed and pregnancy safety will be disabled without surfacing the real error. This makes production misconfigurations look like an expected optional state and can lead to missing safety checks even when the package is present. Consider only suppressing errors when the missing module is the bumpie-meds package itself (e.g., check error.message/require.resolve), and rethrow other MODULE_NOT_FOUND cases.

Useful? React with 👍 / 👎.

} else {
// Re-throw non-module-not-found errors (e.g., syntax errors in the module)
throw error;
}
}

class MedicationTracker {
constructor(dataFile = 'medications.json') {
Expand Down Expand Up @@ -732,13 +750,24 @@ class MedicationTracker {
*/
async checkPregnancySafety(medicationName, weekOfPregnancy, options = {}) {
try {
// Check if pregnancy safety modules are available
if (!this.pregnancySafety) {
console.warn('⚠️ Pregnancy safety check unavailable - modules not loaded');
return {
safe: false,
error: 'Pregnancy safety modules not available',
recommendation: 'Unable to assess safety - consult healthcare provider immediately',
warning: 'The bumpie-meds package is required for pregnancy safety checks'
};
}

const safetyResult = await this.pregnancySafety.checkMedicationSafety(
medicationName,
weekOfPregnancy
);

// Check for pregnancy-specific interactions if taking other medications
if (this.data.medications && this.data.medications.length > 0) {
if (this.pregnancyInteractions && this.data.medications && this.data.medications.length > 0) {
const currentMeds = this.data.medications
.filter(m => m.active)
.map(m => m.name);
Expand All @@ -756,7 +785,7 @@ class MedicationTracker {
}

// Log to audit trail
if (options.patientId) {
if (this.pregnancyAudit && options.patientId) {
await this.pregnancyAudit.logSafetyCheck({
patientId: options.patientId,
medicationName,
Expand Down
2 changes: 0 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.