Skip to content

test: extract-and-test moderate modules + coverage to 26% (Phase 2) - #3364

Merged
jeanfbrito merged 1 commit into
masterfrom
chore/coverage-phase2-extract
Jun 22, 2026
Merged

test: extract-and-test moderate modules + coverage to 26% (Phase 2)#3364
jeanfbrito merged 1 commit into
masterfrom
chore/coverage-phase2-extract

Conversation

@jeanfbrito

@jeanfbrito jeanfbrito commented Jun 22, 2026

Copy link
Copy Markdown
Member

What

Phase 2 of the coverage push: tests for moderate-complexity modules that needed light Electron mocking or a minimal extraction. Stacked on Phase 1.

Stacked on #3363 (base = chore/coverage-phase1-pure-logic). Merge order: #3362#3363 → this.

Coverage delta

Metric Phase 1 end Phase 2 end
Lines 22.34% 26.34%
Statements 22.91% 26.76%
Branches 20.39% 23.61%
Functions 16.11% 19.17%

802 tests pass, 2 skipped, 0 failures. Lint clean.

New / changed specs

Module Coverage Notes
logging/index.ts ~93% 157 lines were uncovered — largest single gain. Factory, hooks, console override, IPC + web-contents logging.
outlookCalendar/getOutlookEvents.ts 0% → ~95% See latent-bug note below.
screenSharing/ScreenSharingRequestTracker.ts ~96% Timeout/listener state machine via fake timers.
utils/browserLauncher.ts ~93% Async lazy-load + promise caching.
ipc/renderer.ts 100% lines invoke/handle/retry wrappers.
navigation/main.ts (serializeCertificate, isProtocolAllowed) utils covered See source-change note.

Latent bug fixed (getOutlookEvents)

The existing getOutlookEvents.spec.ts lived at a path that matched neither jest project glob, so it was silently never executed (0% coverage despite ~340 lines of tests). Moving it into __tests__/ makes jest discover it. On first execution, 3 pre-existing assertions failed — they encoded behavior the source never had; reconciled to actual (correct) source behavior with explanatory comments. No source logic changed.

This is exactly the failure mode the Phase 1 placement-pitfall guard was written for — now caught.

Source change (1 keyword)

navigation/main.ts: added export to serializeCertificate so it can be unit-tested (it had 1 internal caller, unchanged). Impact analysis: LOW risk. isProtocolAllowed was already exported (CRITICAL blast radius — 6 callers — so left untouched, just tested). No logic moved, no signatures changed.

Ratchet gate

Bumps coverageThreshold to lines/statements 25, branches 22, functions 18 (just under the new baseline). Active in CI via validate-pr.yml.

Toward 50%

The remaining gap to a 50% goal is concentrated in ui/ (React components, ~3000 lines) and integration-only files (videoCallWindow/ipc.ts, ui/main/serverView, logViewerWindow.tsx). Those need a renderer-component testing harness (Fuselage + Redux + Electron-renderer mocking) — a larger Phase 3 initiative, planned separately.

Summary by CodeRabbit

  • Tests

    • Added Jest coverage for IPC renderer helpers, main-process logging initialization, navigation certificate/permission flows, Outlook calendar event retrieval + URL normalization, screen-sharing request tracking, and browser launcher behavior.
    • Removed an existing Jest suite that previously covered Outlook exchange URL sanitization edge cases.
  • Chores

    • Tightened Jest global coverage thresholds (lines/statements/branches/functions) to require higher minimum coverage.

@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 147318a9-3038-47a3-ae19-5db31ea8af5d

📥 Commits

Reviewing files that changed from the base of the PR and between 35bacdd and c263950.

📒 Files selected for processing (9)
  • jest.config.js
  • src/ipc/renderer.spec.ts
  • src/logging/main/index.main.spec.ts
  • src/navigation/main.spec.ts
  • src/navigation/main.ts
  • src/outlookCalendar/__tests__/getOutlookEvents.spec.ts
  • src/outlookCalendar/getOutlookEvents.spec.ts
  • src/screenSharing/main/ScreenSharingRequestTracker.main.spec.ts
  • src/utils/__tests__/browserLauncher.spec.ts

Walkthrough

New Jest test suites are added for six modules: IPC renderer helpers, main-process logging, navigation protocol handling, Outlook Calendar EWS utilities, screen sharing request tracking, and browser launcher. The existing Outlook spec is deleted and replaced by an expanded version moved to a subdirectory. serializeCertificate is exported to enable direct testing, and Jest coverage thresholds are raised.

Changes

Test Coverage Expansion

Layer / File(s) Summary
Coverage thresholds and serializeCertificate export
jest.config.js, src/navigation/main.ts
Jest global coverage minimums for lines/statements/branches/functions are raised. serializeCertificate is changed to an exported constant to allow direct test imports.
IPC renderer helper tests
src/ipc/renderer.spec.ts
New suite tests invoke forwarding, handle listener registration/disposal and reply serialization, and invokeWithRetry retry/backoff/logging behavior using fake timers.
Navigation protocol and certificate tests
src/navigation/main.spec.ts
New suite tests serializeCertificate output format and isProtocolAllowed behavior for intrinsic protocols, persisted allow/deny, unknown-protocol dialog prompting, dontAskAgain dispatch, and malformed URL rejection.
Main-process logging tests
src/logging/main/index.main.spec.ts
New suite covers configureLogging transport/hook/level/chmod initialization, console override routing and writeFn non-recursion, error JSONL buffering and truncation, before-quit flush, logWithContext/setLogLevel/getLogLevel, setupDebugLoggingWatch, setupWebContentsLogging IPC handlers, and re-exports.
Outlook Calendar EWS tests (relocated and expanded)
src/outlookCalendar/__tests__/getOutlookEvents.spec.ts
Old spec is deleted; replacement in __tests__/ adds getOutlookEvents credential/mapping/error tests, testExchangeServerConnectivity fetch-mock tests, and a large sanitizeExchangeUrl normalization matrix.
ScreenSharingRequestTracker tests
src/screenSharing/main/ScreenSharingRequestTracker.main.spec.ts
New suite tests createRequest initialization and duplicate handling, response-listener resolution paths, timeout behavior with fake timers, and full cleanup lifecycle.
Browser launcher tests
src/utils/__tests__/browserLauncher.spec.ts
New suite tests openExternal lazy detection, browser dispatch, single-shot caching, fallback behavior, launchBrowser failure propagation, and preloadBrowsersList background scheduling via jest.isolateModules().

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the PR's main objective: adding tests to moderate modules while increasing coverage to 26% in Phase 2 of a coverage expansion initiative.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint install failed. For unrecoverable errors, disable the tool in CodeRabbit configuration.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/outlookCalendar/__tests__/getOutlookEvents.spec.ts (1)

714-728: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Rename the “connectivity” test block to match actual behavior

Lines 714-728 describe and comment these cases as connectivity checks, but sanitizeExchangeUrl only normalizes/validates URLs (no network probing). Please rename this block/tests to URL-construction behavior to avoid misleading coverage intent.

Suggested rename
-describe('Connectivity testing features', () => {
-  it('handles connectivity testing gracefully when it fails', () => {
-    // Test that even if connectivity testing fails, the function still returns a valid URL
+describe('URL normalization resilience', () => {
+  it('returns a valid EWS URL for unreachable-looking hosts', () => {
     const result = sanitizeExchangeUrl('https://unreachable.example.com');
     expect(result).toBe(
       'https://unreachable.example.com/ews/exchange.asmx'
     );
   });

-  it('runs connectivity testing automatically on this debugging branch', () => {
-    // Connectivity testing runs automatically, validating the URL construction works
+  it('normalizes a standard HTTPS host to the EWS endpoint', () => {
     const result = sanitizeExchangeUrl('https://mail.company.com');
     expect(result).toBe('https://mail.company.com/ews/exchange.asmx');
   });
 });

As per coding guidelines, “Avoid unnecessary comments — write self-documenting code through clear naming.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/outlookCalendar/__tests__/getOutlookEvents.spec.ts` around lines 714 -
728, Rename the describe block from "Connectivity testing features" to
accurately reflect that it tests URL construction behavior (not network
connectivity). Rename both test cases within this block to describe what
sanitizeExchangeUrl actually does: the first test should reflect that it returns
a normalized URL path regardless of whether the domain exists, and the second
test should reflect basic URL normalization. Remove the misleading comments
about connectivity testing and replace them with clear descriptions of the URL
normalization behavior being validated, ensuring test names and descriptions
accurately represent that sanitizeExchangeUrl only constructs and normalizes
URLs without performing any network connectivity checks.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/navigation/main.spec.ts`:
- Around line 1-163: The test file currently named main.spec.ts does not follow
the Main-process spec naming convention. Rename the file from
src/navigation/main.spec.ts to src/navigation/navigation.main.spec.ts to match
the required *.main.spec.ts pattern for Main-process tests, where the feature
name precedes .main.spec.ts.

---

Nitpick comments:
In `@src/outlookCalendar/__tests__/getOutlookEvents.spec.ts`:
- Around line 714-728: Rename the describe block from "Connectivity testing
features" to accurately reflect that it tests URL construction behavior (not
network connectivity). Rename both test cases within this block to describe what
sanitizeExchangeUrl actually does: the first test should reflect that it returns
a normalized URL path regardless of whether the domain exists, and the second
test should reflect basic URL normalization. Remove the misleading comments
about connectivity testing and replace them with clear descriptions of the URL
normalization behavior being validated, ensuring test names and descriptions
accurately represent that sanitizeExchangeUrl only constructs and normalizes
URLs without performing any network connectivity checks.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8e21b8bb-d6c7-4262-8dbb-33c7b8bae3a2

📥 Commits

Reviewing files that changed from the base of the PR and between 54013d1 and 35bacdd.

📒 Files selected for processing (9)
  • jest.config.js
  • src/ipc/renderer.spec.ts
  • src/logging/main/index.main.spec.ts
  • src/navigation/main.spec.ts
  • src/navigation/main.ts
  • src/outlookCalendar/__tests__/getOutlookEvents.spec.ts
  • src/outlookCalendar/getOutlookEvents.spec.ts
  • src/screenSharing/main/ScreenSharingRequestTracker.main.spec.ts
  • src/utils/__tests__/browserLauncher.spec.ts
💤 Files with no reviewable changes (1)
  • src/outlookCalendar/getOutlookEvents.spec.ts
📜 Review details
🧰 Additional context used
📓 Path-based instructions (7)
**/*.ts

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.ts: Use TypeScript for all new code unless explicitly told otherwise
Use optional chaining with fallbacks for platform-specific APIs instead of mocking when possible. Example: const uid = process.getuid?.() ?? 1000;

Files:

  • src/navigation/main.ts
  • src/navigation/main.spec.ts
  • src/screenSharing/main/ScreenSharingRequestTracker.main.spec.ts
  • src/ipc/renderer.spec.ts
  • src/utils/__tests__/browserLauncher.spec.ts
  • src/outlookCalendar/__tests__/getOutlookEvents.spec.ts
  • src/logging/main/index.main.spec.ts
**/*.{tsx,ts}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{tsx,ts}: MANDATORY: Use Fuselage components for all UI work. Only create custom components when Fuselage doesn't provide what's needed
Import UI components from @rocket.chat/fuselage and check Theme.d.ts for valid color tokens
Use React functional components with hooks
Use PascalCase for component file names

Files:

  • src/navigation/main.ts
  • src/navigation/main.spec.ts
  • src/screenSharing/main/ScreenSharingRequestTracker.main.spec.ts
  • src/ipc/renderer.spec.ts
  • src/utils/__tests__/browserLauncher.spec.ts
  • src/outlookCalendar/__tests__/getOutlookEvents.spec.ts
  • src/logging/main/index.main.spec.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Redux actions must follow FSA (Flux Standard Action) pattern
Avoid unnecessary comments — write self-documenting code through clear naming
Always verify libraries by checking official docs and .d.ts files in node_modules/. Never assume props, tokens, or APIs work without verification
Avoid subjective descriptors ('smart', 'excellent', 'dumb') in documentation and comments
Use measurable descriptions in code documentation: 'reduced memory usage', 'improved by X%' instead of subjective claims
NEVER invent metrics — don't include estimated time spent or speculated user counts. Only include numbers from actual logs, error messages, or documented sources

Files:

  • src/navigation/main.ts
  • src/navigation/main.spec.ts
  • src/screenSharing/main/ScreenSharingRequestTracker.main.spec.ts
  • src/ipc/renderer.spec.ts
  • src/utils/__tests__/browserLauncher.spec.ts
  • src/outlookCalendar/__tests__/getOutlookEvents.spec.ts
  • src/logging/main/index.main.spec.ts
**/*.spec.ts

📄 CodeRabbit inference engine (CLAUDE.md)

Use *.spec.ts file naming for Renderer process tests

Files:

  • src/navigation/main.spec.ts
  • src/screenSharing/main/ScreenSharingRequestTracker.main.spec.ts
  • src/ipc/renderer.spec.ts
  • src/utils/__tests__/browserLauncher.spec.ts
  • src/outlookCalendar/__tests__/getOutlookEvents.spec.ts
  • src/logging/main/index.main.spec.ts
**/*.{spec.ts,main.spec.ts}

📄 CodeRabbit inference engine (CLAUDE.md)

Only mock platform-specific APIs when defensive coding isn't possible. Linux-only APIs requiring mocks: process.getuid(), process.getgid(), process.geteuid(), process.getegid()

Files:

  • src/navigation/main.spec.ts
  • src/screenSharing/main/ScreenSharingRequestTracker.main.spec.ts
  • src/ipc/renderer.spec.ts
  • src/utils/__tests__/browserLauncher.spec.ts
  • src/outlookCalendar/__tests__/getOutlookEvents.spec.ts
  • src/logging/main/index.main.spec.ts
**/*.main.spec.ts

📄 CodeRabbit inference engine (CLAUDE.md)

Use *.main.spec.ts file naming for Main process tests

Files:

  • src/screenSharing/main/ScreenSharingRequestTracker.main.spec.ts
  • src/logging/main/index.main.spec.ts
src/outlookCalendar/**/*.{ts,tsx}

📄 CodeRabbit inference engine (src/outlookCalendar/AGENTS.md)

src/outlookCalendar/**/*.{ts,tsx}: Use createClassifiedError() from errorClassification.ts for user-facing errors to provide error categorization, user-friendly messages, and structured error context
Always use outlookError() for errors as it logs regardless of verbose mode settings, ensuring errors are always visible to users

Files:

  • src/outlookCalendar/__tests__/getOutlookEvents.spec.ts
🔇 Additional comments (12)
src/ipc/renderer.spec.ts (1)

1-188: LGTM!

jest.config.js (1)

15-18: LGTM!

src/navigation/main.ts (1)

41-41: LGTM!

src/screenSharing/main/ScreenSharingRequestTracker.main.spec.ts (1)

1-325: LGTM!

src/utils/__tests__/browserLauncher.spec.ts (1)

1-219: LGTM!

src/logging/main/index.main.spec.ts (7)

1-125: LGTM!


127-223: LGTM!


224-277: LGTM!


279-376: LGTM!


378-457: LGTM!


459-670: LGTM!


673-689: LGTM!

Comment on lines +1 to +163
import type { Certificate } from 'electron';

import { select, dispatch } from '../store';
import { askForOpeningExternalProtocol } from '../ui/main/dialogs';
import { EXTERNAL_PROTOCOL_PERMISSION_UPDATED } from './actions';
import { serializeCertificate, isProtocolAllowed } from './main';

jest.mock('electron', () => ({
app: {
addListener: jest.fn(),
getPath: jest.fn(),
},
}));
jest.mock('../store');
jest.mock('../ui/main/dialogs');

const selectMock = select as jest.MockedFunction<typeof select>;
const dispatchMock = dispatch as jest.MockedFunction<typeof dispatch>;
const askForOpeningExternalProtocolMock =
askForOpeningExternalProtocol as jest.MockedFunction<
typeof askForOpeningExternalProtocol
>;

const makeCertificate = (overrides: Partial<Certificate> = {}): Certificate =>
({
issuerName: 'Example CA',
data: 'CERT-DATA',
...overrides,
}) as unknown as Certificate;

describe('navigation/main.ts', () => {
beforeEach(() => {
jest.clearAllMocks();
});

describe('serializeCertificate', () => {
it('serializes as "<issuerName>\\n<data>"', () => {
const certificate = makeCertificate({
issuerName: 'Example CA',
data: 'CERT-DATA',
});

expect(serializeCertificate(certificate)).toBe('Example CA\nCERT-DATA');
});

it('calls toString() on the data field', () => {
const toString = jest.fn(() => 'STRINGIFIED');
const certificate = makeCertificate({
issuerName: 'Issuer',
data: { toString } as unknown as Certificate['data'],
});

expect(serializeCertificate(certificate)).toBe('Issuer\nSTRINGIFIED');
expect(toString).toHaveBeenCalledTimes(1);
});

it('handles empty issuer name', () => {
const certificate = makeCertificate({ issuerName: '', data: 'D' });

expect(serializeCertificate(certificate)).toBe('\nD');
});
});

describe('isProtocolAllowed', () => {
const mockExternalProtocols = (
externalProtocols: Record<string, boolean>
) => {
selectMock.mockImplementation((selector: any) =>
selector({ externalProtocols })
);
};

it.each(['http://example.com', 'https://example.com', 'mailto:a@b.com'])(
'allows intrinsic protocol %s without prompting',
async (url) => {
mockExternalProtocols({});

await expect(isProtocolAllowed(url)).resolves.toBe(true);
expect(askForOpeningExternalProtocolMock).not.toHaveBeenCalled();
expect(dispatchMock).not.toHaveBeenCalled();
}
);

it('allows a persisted protocol that is marked allowed', async () => {
mockExternalProtocols({ 'custom:': true });

await expect(isProtocolAllowed('custom://thing')).resolves.toBe(true);
expect(askForOpeningExternalProtocolMock).not.toHaveBeenCalled();
});

it('does not treat a persisted protocol marked as disallowed as intrinsic', async () => {
mockExternalProtocols({ 'custom:': false });
askForOpeningExternalProtocolMock.mockResolvedValue({
allowed: false,
dontAskAgain: false,
});

await expect(isProtocolAllowed('custom://thing')).resolves.toBe(false);
expect(askForOpeningExternalProtocolMock).toHaveBeenCalledTimes(1);
});

it('prompts for an unknown protocol and returns the dialog result', async () => {
mockExternalProtocols({});
askForOpeningExternalProtocolMock.mockResolvedValue({
allowed: true,
dontAskAgain: false,
});

await expect(isProtocolAllowed('custom://thing')).resolves.toBe(true);
expect(askForOpeningExternalProtocolMock).toHaveBeenCalledTimes(1);
expect(askForOpeningExternalProtocolMock.mock.calls[0][0]).toBeInstanceOf(
URL
);
expect(dispatchMock).not.toHaveBeenCalled();
});

it('returns false when the dialog denies and dontAskAgain is false', async () => {
mockExternalProtocols({});
askForOpeningExternalProtocolMock.mockResolvedValue({
allowed: false,
dontAskAgain: false,
});

await expect(isProtocolAllowed('custom://thing')).resolves.toBe(false);
expect(dispatchMock).not.toHaveBeenCalled();
});

it('persists the permission when dontAskAgain is true (allowed)', async () => {
mockExternalProtocols({});
askForOpeningExternalProtocolMock.mockResolvedValue({
allowed: true,
dontAskAgain: true,
});

await expect(isProtocolAllowed('custom://thing')).resolves.toBe(true);
expect(dispatchMock).toHaveBeenCalledWith({
type: EXTERNAL_PROTOCOL_PERMISSION_UPDATED,
payload: { protocol: 'custom:', allowed: true },
});
});

it('persists the denial when dontAskAgain is true (denied)', async () => {
mockExternalProtocols({});
askForOpeningExternalProtocolMock.mockResolvedValue({
allowed: false,
dontAskAgain: true,
});

await expect(isProtocolAllowed('custom://thing')).resolves.toBe(false);
expect(dispatchMock).toHaveBeenCalledWith({
type: EXTERNAL_PROTOCOL_PERMISSION_UPDATED,
payload: { protocol: 'custom:', allowed: false },
});
});

it('rejects on a malformed URL', async () => {
mockExternalProtocols({});

await expect(isProtocolAllowed('not a url')).rejects.toThrow();
expect(askForOpeningExternalProtocolMock).not.toHaveBeenCalled();
});
});
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Rename this test file to follow the Main-process spec naming convention.

This suite targets a Main-process module (src/navigation/main.ts), so it should be named with the *.main.spec.ts pattern (for example, navigation.main.spec.ts) rather than main.spec.ts.

As per coding guidelines, "**/*.main.spec.ts: Use *.main.spec.ts file naming for Main process tests".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/navigation/main.spec.ts` around lines 1 - 163, The test file currently
named main.spec.ts does not follow the Main-process spec naming convention.
Rename the file from src/navigation/main.spec.ts to
src/navigation/navigation.main.spec.ts to match the required *.main.spec.ts
pattern for Main-process tests, where the feature name precedes .main.spec.ts.

Source: Coding guidelines

@jeanfbrito
jeanfbrito force-pushed the chore/coverage-phase1-pure-logic branch from 54013d1 to c46c552 Compare June 22, 2026 16:23
Base automatically changed from chore/coverage-phase1-pure-logic to master June 22, 2026 16:24
Adds unit tests for modules needing light Electron mocking or a minimal
extraction, continuing the coverage push from Phase 1.

- navigation/main.ts: export serializeCertificate (one keyword, no
  behavior change) + test it and the already-exported isProtocolAllowed
- screenSharing/ScreenSharingRequestTracker.ts: timeout/listener state
  machine via fake timers (~96%)
- utils/browserLauncher.ts: async lazy-load + promise caching (~93%)
- ipc/renderer.ts: invoke/handle/retry wrappers (100% lines)
- logging/index.ts: logger factory, hooks, console override, IPC + web-
  contents logging (~93%, 157 lines were uncovered — largest single gain)
- outlookCalendar/getOutlookEvents.ts: relocate the spec into __tests__/
  so the jest glob actually discovers it (it was silently never running),
  fix 3 stale assertions to match real source behavior, add appointment-
  mapping + connectivity coverage (0% -> ~95%)

Ratchets coverageThreshold to lines/statements 25, branches 22,
functions 18.

Coverage: lines 22.34% -> 26.34%, statements 22.91% -> 26.76%,
branches 20.39% -> 23.61%, functions 16.11% -> 19.17%.
802 tests pass.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant