Skip to content
Draft
Show file tree
Hide file tree
Changes from 2 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
5 changes: 5 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,11 @@
"types": "./dist/types/deviceUtil/index.d.ts",
"require": "./dist/types/deviceUtil/index.js",
"import": "./dist/types/deviceUtil/index.js"
},
"./easterEggUtil": {
"types": "./dist/types/easterEggUtil/index.d.ts",
"require": "./dist/types/easterEggUtil/index.js",
"import": "./dist/types/easterEggUtil/index.js"
}
},
"scripts": {
Expand Down
79 changes: 79 additions & 0 deletions package/easterEggUtil/generateHappy/index.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { describe, test, expect, vi, beforeEach, afterEach } from "vitest";
import generateHappy from ".";

describe("generateHappy", () => {
let consoleLogSpy: ReturnType<typeof vi.spyOn>;

beforeEach(() => {
// console.logλ₯Ό spy둜 λŒ€μ²΄ν•˜μ—¬ 호좜 μ—¬λΆ€λ₯Ό μΆ”μ ν•©λ‹ˆλ‹€.
consoleLogSpy = vi.spyOn(console, "log").mockImplementation(() => {});
});

afterEach(() => {
// 각 ν…ŒμŠ€νŠΈ ν›„ spyλ₯Ό λ³΅μ›ν•©λ‹ˆλ‹€.
consoleLogSpy.mockRestore();
});

test("μ‚¬μš©μž μ •μ˜ λ©”μ‹œμ§€κ°€ 없을 λ•Œ κΈ°λ³Έ λ©”μ‹œμ§€ 쀑 ν•˜λ‚˜λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€", () => {
const result = generateHappy();

const defaultMessages = [
"Keep going β€” you're doing great! πŸ’ͺ",
"Small steps lead to big changes. 🌱",
"Today is a good day to smile. 😊",
"You're closer than you think. 🌈",
"Stay curious, stay kind. ✨",
"Progress, not perfection. πŸš€",
"You make the code better. πŸ’»β€οΈ",
"Breathe. You're doing your best. 🌀️",
"Trust the process, enjoy the journey. πŸ›€οΈ",
"Every bug fixed is a victory. πŸžπŸ†",
];

expect(defaultMessages).toContain(result);
});

test("μ‚¬μš©μž μ •μ˜ λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•˜λ©΄ ν•΄λ‹Ή λ©”μ‹œμ§€λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€", () => {
const customMessage = "Custom happy message!";
const result = generateHappy(customMessage);

expect(result).toBe(customMessage);
});

test("console.logκ°€ ν˜ΈμΆœλ˜μ–΄μ•Ό ν•œλ‹€", () => {
generateHappy("Test message");

expect(consoleLogSpy).toHaveBeenCalledTimes(1);
});

test("console.log에 νƒ€μž„μŠ€νƒ¬ν”„μ™€ λ©”μ‹œμ§€κ°€ ν¬ν•¨λ˜μ–΄μ•Ό ν•œλ‹€", () => {
const testMessage = "Test message";
generateHappy(testMessage);

expect(consoleLogSpy).toHaveBeenCalled();
const [firstArg] = consoleLogSpy.mock.calls[0];

// 첫 번째 μΈμžμ— νƒ€μž„μŠ€νƒ¬ν”„μ™€ λ©”μ‹œμ§€κ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 확인
expect(firstArg).toContain(testMessage);
expect(firstArg).toMatch(/\[\d{1,2}:\d{2}:\d{2}.*\]/); // νƒ€μž„μŠ€νƒ¬ν”„ ν˜•μ‹ 확인
});

test("console.log에 μ˜¬λ°”λ₯Έ μŠ€νƒ€μΌμ΄ μ μš©λ˜μ–΄μ•Ό ν•œλ‹€", () => {
generateHappy("Test message");

expect(consoleLogSpy).toHaveBeenCalled();
const args = consoleLogSpy.mock.calls[0];

// μŠ€νƒ€μΌ μΈμžλ“€μ΄ μ˜¬λ°”λ₯΄κ²Œ μ „λ‹¬λ˜μ—ˆλŠ”μ§€ 확인
expect(args[1]).toBe('color: #ff69b4; font-weight: bold;');
expect(args[2]).toBe('color: #333; font-size: 14px;');
});

test("μ—¬λŸ¬ 번 ν˜ΈμΆœν•΄λ„ μ •μƒμ μœΌλ‘œ λ™μž‘ν•΄μ•Ό ν•œλ‹€", () => {
generateHappy("Message 1");
generateHappy("Message 2");
generateHappy();

expect(consoleLogSpy).toHaveBeenCalledTimes(3);
});
});
32 changes: 32 additions & 0 deletions package/easterEggUtil/generateHappy/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/**
* κ°œλ°œμžμ—κ²Œ 격렀 λ©”μ‹œμ§€λ₯Ό μ½˜μ†”μ— 좜λ ₯ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
* @param message 좜λ ₯ν•  μ‚¬μš©μž μ •μ˜ λ©”μ‹œμ§€ (선택 사항)
* @returns {string} 좜λ ₯된 λ©”μ‹œμ§€ ν…μŠ€νŠΈ
*/
export default function generateHappy(message?: string) {
const defaultMessages = [
"Keep going β€” you're doing great! πŸ’ͺ",
"Small steps lead to big changes. 🌱",
"Today is a good day to smile. 😊",
"You're closer than you think. 🌈",
"Stay curious, stay kind. ✨",
"Progress, not perfection. πŸš€",
"You make the code better. πŸ’»β€οΈ",
"Breathe. You're doing your best. 🌀️",
"Trust the process, enjoy the journey. πŸ›€οΈ",
"Every bug fixed is a victory. πŸžπŸ†",
];

const text =
message ??
defaultMessages[Math.floor(Math.random() * defaultMessages.length)];
const timestamp = new Date().toLocaleTimeString();

console.log(
`%c[${timestamp}] %c${text}`,
'color: #ff69b4; font-weight: bold;',
'color: #333; font-size: 14px;'
);

return text;
}
1 change: 1 addition & 0 deletions package/easterEggUtil/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default as generateHappy } from "./generateHappy";
2 changes: 2 additions & 0 deletions package/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export * as searchQueryUtil from "./searchQueryUtil";
export * as typeUtil from "./typeUtil";
export * as formatUtil from "./formatUtil";
export * as deviceUtil from "./deviceUtil";
export * as easterEggUtil from "./easterEggUtil";

// κ°œλ³„ ν•¨μˆ˜μ— λŒ€ν•œ 읡슀포트 μ§„ν–‰
export * from "./stringUtil";
Expand All @@ -21,3 +22,4 @@ export * from "./searchQueryUtil";
export * from "./typeUtil";
export * from "./formatUtil";
export * from "./deviceUtil";
export * from "./easterEggUtil";
Loading