diff --git a/examples/element-factory/src/alert-button.jsx b/examples/element-factory/src/alert-button.jsx
index da8da76..74cf614 100644
--- a/examples/element-factory/src/alert-button.jsx
+++ b/examples/element-factory/src/alert-button.jsx
@@ -1,7 +1,10 @@
import { useState } from 'react';
-export const AlertButton = ({}) => {
- const [message, setMessage] = useState('Alert!');
+export const AlertButton = ({
+ onSubmit = () => {},
+ defaultMessage = 'Alert!',
+}) => {
+ const [message, setMessage] = useState(defaultMessage);
return (
@@ -14,7 +17,7 @@ export const AlertButton = ({}) => {
/>
-
+
);
};
diff --git a/examples/element-factory/src/alert-button.test.jsx b/examples/element-factory/src/alert-button.test.jsx
index 972c696..dc96a29 100644
--- a/examples/element-factory/src/alert-button.test.jsx
+++ b/examples/element-factory/src/alert-button.test.jsx
@@ -11,17 +11,20 @@ describe('AlertButton', () => {
it('should render an alert button', async () => {});
it.only('should trigger an alert', async () => {
- // const logSpy = vi.spyOn(console, 'log').mockImplementation(() => {})
+ const handleSubmit = vi.fn();
+
+ render();
- render();
const input = screen.getByLabelText('Message');
const button = screen.getByRole('button', { name: /trigger alert/i });
await act(async () => {
+ await userEvent.clear(input);
await userEvent.type(input, 'Hello');
+ await userEvent.click(button);
});
- // Click on the button.
- // Look and see if alert() was called with the message.
+ expect(handleSubmit).toHaveBeenCalled();
+ expect(handleSubmit).toHaveBeenCalledWith('Hello');
});
});
diff --git a/examples/logjam/src/log.js b/examples/logjam/src/log.js
index f675f43..f6394a5 100644
--- a/examples/logjam/src/log.js
+++ b/examples/logjam/src/log.js
@@ -6,11 +6,14 @@ import { sendToServer } from './send-to-server';
* Log a message to the console in development mode or send it to the server in production mode.
* @param {string} message
*/
-export function log(message) {
- if (import.meta.env.MODE !== 'production') {
+export function log(
+ message,
+ { productionCallback = () => {}, mode = import.meta.env.MODE } = {},
+) {
+ if (mode !== 'production') {
console.log(message);
} else {
- sendToServer('info', message);
+ productionCallback('info', message);
}
}
diff --git a/examples/logjam/src/log.test.js b/examples/logjam/src/log.test.js
index aafcb9f..4d0fd96 100644
--- a/examples/logjam/src/log.test.js
+++ b/examples/logjam/src/log.test.js
@@ -1,4 +1,33 @@
import { expect, it, vi, beforeEach, afterEach, describe } from 'vitest';
import { log } from './log';
-describe.todo('logger', () => {});
+describe('logger', () => {
+ describe('development', () => {
+ it('logs to the console in development mode', () => {
+ const logSpy = vi.fn();
+
+ log('Hello World');
+
+ expect(logSpy).toHaveBeenCalledWith('Hello World');
+ });
+ });
+
+ describe('production', () => {
+ beforeEach(() => {
+ vi.stubEnv('MODE', 'production');
+ });
+
+ afterEach(() => {
+ vi.restoreAllMocks();
+ });
+
+ it('should not call console.log in production', () => {
+ const logSpy = vi.spyOn(console, 'log');
+
+ log('Hello World', { mode: 'production', productionCallback: logSpy });
+
+ expect(logSpy).not.toHaveBeenCalled();
+ expect(sendToServer).toHaveBeenCalled();
+ });
+ });
+});
diff --git a/examples/logjam/src/send-to-server.js b/examples/logjam/src/send-to-server.js
index ada0932..f81928a 100644
--- a/examples/logjam/src/send-to-server.js
+++ b/examples/logjam/src/send-to-server.js
@@ -4,5 +4,6 @@
* @param {string} message
*/
export const sendToServer = (level, message) => {
+ throw new Error('I should not run!');
return `You must mock this function: sendToServer(${level}, ${message})`;
};
diff --git a/examples/scratchpad/fake-time.test.js b/examples/scratchpad/fake-time.test.js
index 748dfc6..feaf501 100644
--- a/examples/scratchpad/fake-time.test.js
+++ b/examples/scratchpad/fake-time.test.js
@@ -1,6 +1,4 @@
-import { vi, describe, it, expect } from 'vitest';
-
-vi.useFakeTimers();
+import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
function delay(callback) {
setTimeout(() => {
@@ -9,5 +7,22 @@ function delay(callback) {
}
describe('delay function', () => {
- it.todo('should call callback after delay', () => {});
+ beforeEach(() => {
+ vi.useFakeTimers();
+ vi.setSystemTime('2024-02-29');
+ });
+
+ afterEach(() => {
+ vi.useRealTimers();
+ });
+
+ it('should call callback after delay', () => {
+ const callback = vi.fn();
+
+ delay(callback);
+ vi.advanceTimersToNextTimer();
+
+ expect(callback).toHaveBeenCalled();
+ expect(new Date()).toBe(null);
+ });
});