diff --git a/TypeScript/test/vitest/approvals.spec.ts b/TypeScript/test/vitest/approvals.spec.ts
new file mode 100644
index 00000000..ee7cad4f
--- /dev/null
+++ b/TypeScript/test/vitest/approvals.spec.ts
@@ -0,0 +1,54 @@
+import { execSync } from "node:child_process";
+import { Item, GildedRose } from "@/gilded-rose";
+
+/**
+ * This unit test uses [Jest Snapshot](https://goo.gl/fbAQLP).
+ *
+ * There are two test cases here with different styles:
+ *
"foo" is more similar to the unit test from the 'Java' version
+ * "thirtyDays" is more similar to the TextTest from the 'Java' version
+ *
+ * I suggest choosing one style to develop and deleting the other.
+ */
+
+describe("Gilded Rose Approval", () => {
+ let gameConsoleOutput: string;
+ let originalConsoleLog: (message: any) => void;
+ let originalProcessArgv: string[];
+
+ function gameConsoleLog(msg: string) {
+ if (msg) {
+ gameConsoleOutput += msg;
+ }
+ gameConsoleOutput += "\n";
+ }
+
+ beforeEach(() => {
+ // prepare capturing console.log to our own gameConsoleLog.
+ gameConsoleOutput = "";
+ originalConsoleLog = console.log;
+ console.log = gameConsoleLog;
+ originalProcessArgv = process.argv;
+ });
+
+ afterEach(() => {
+ // reset original console.log
+ console.log = originalConsoleLog;
+ process.argv = originalProcessArgv;
+ });
+
+ it("should foo", () => {
+ const gildedRose = new GildedRose([new Item("foo", 0, 0)]);
+ const items = gildedRose.updateQuality();
+
+ expect(items).toMatchSnapshot();
+ });
+
+ it("should thirtyDays", () => {
+ execSync(`ts-node test/golden-master-text-test.ts 30`, {
+ stdio: "inherit",
+ });
+
+ expect(gameConsoleOutput).toMatchSnapshot();
+ });
+});