mirror of
https://github.com/photoprism/photoprism.git
synced 2025-12-12 00:34:13 +01:00
* Tests: convert all common tests from mocha to karma * Tests: refactor Vuetify setup in tests * Tests: update package-lock.json * Tests: convert all model test to vitest 1/2 * Tests: convert all model test to vitest 2/2 * Tests: fix broken test * Tests: time zone UTC * Tests: Add playwright screenshots folder to gitignore * Tests: Add timezone to vitest scripts * Tests: Add Vitest scripts to Makefile * Tests: delete unused timezone configs * Tests: Update some tests * Tests: Update vitest config * Tests: Delete usesless try-catch
129 lines
3.6 KiB
JavaScript
129 lines
3.6 KiB
JavaScript
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
import { mount } from "@vue/test-utils";
|
|
import PSidebarInfo from "component/sidebar/info.vue";
|
|
import { DateTime } from "luxon";
|
|
|
|
// Mock dependencies
|
|
vi.mock("component/map.vue", () => ({
|
|
default: {
|
|
name: "p-map",
|
|
template: "<div class='p-map-stub'></div>",
|
|
props: ["lat", "lng"],
|
|
},
|
|
}));
|
|
|
|
// Mock formats module properly
|
|
vi.mock("options/formats", () => ({
|
|
DATETIME_MED: "DATETIME_MED",
|
|
DATETIME_MED_TZ: "DATETIME_MED_TZ",
|
|
}));
|
|
|
|
describe("PSidebarInfo component", () => {
|
|
let wrapper;
|
|
let originalFromISO;
|
|
|
|
const mockModel = {
|
|
UID: "abc123",
|
|
Title: "Test Title",
|
|
Caption: "Test Caption",
|
|
TakenAtLocal: "2023-01-01T10:00:00Z",
|
|
TimeZone: "UTC",
|
|
Lat: 52.52,
|
|
Lng: 13.405,
|
|
getTypeInfo: vi.fn().mockReturnValue("JPEG, 1920x1080"),
|
|
getTypeIcon: vi.fn().mockReturnValue("mdi-file-image"),
|
|
getLatLng: vi.fn().mockReturnValue("52.5200, 13.4050"),
|
|
copyLatLng: vi.fn(),
|
|
};
|
|
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
|
|
// Store original DateTime.fromISO function
|
|
originalFromISO = DateTime.fromISO;
|
|
|
|
// Create a mock for DateTime.fromISO
|
|
DateTime.fromISO = vi.fn().mockImplementation(() => {
|
|
return {
|
|
toLocaleString: (format) => "January 1, 2023, 10:00 AM",
|
|
};
|
|
});
|
|
|
|
wrapper = mount(PSidebarInfo, {
|
|
props: {
|
|
modelValue: mockModel,
|
|
context: "photos",
|
|
},
|
|
global: {
|
|
stubs: {
|
|
PMap: true,
|
|
},
|
|
},
|
|
});
|
|
});
|
|
|
|
afterEach(() => {
|
|
// Restore original DateTime.fromISO
|
|
DateTime.fromISO = originalFromISO;
|
|
});
|
|
|
|
it("should render correctly with model data", () => {
|
|
expect(wrapper.vm).toBeTruthy();
|
|
expect(wrapper.find(".p-sidebar-info").exists()).toBe(true);
|
|
|
|
const html = wrapper.html();
|
|
expect(html).toContain("Test Title");
|
|
expect(html).toContain("Test Caption");
|
|
|
|
expect(mockModel.getTypeInfo).toHaveBeenCalled();
|
|
expect(mockModel.getTypeIcon).toHaveBeenCalled();
|
|
expect(mockModel.getLatLng).toHaveBeenCalled();
|
|
});
|
|
|
|
it("should emit close event when close button is clicked", async () => {
|
|
// Try finding close button by various selectors
|
|
const closeButtonSelectors = [".close-button", "button[aria-label='Close']", "button[title='Close']"];
|
|
|
|
let closeButton;
|
|
for (const selector of closeButtonSelectors) {
|
|
closeButton = wrapper.find(selector);
|
|
if (closeButton.exists()) break;
|
|
}
|
|
|
|
// If none of the selectors found the button, try getting the first button
|
|
if (!closeButton || !closeButton.exists()) {
|
|
const allButtons = wrapper.findAll("button");
|
|
if (allButtons.length > 0) {
|
|
closeButton = allButtons[0];
|
|
}
|
|
}
|
|
|
|
if (closeButton && closeButton.exists()) {
|
|
await closeButton.trigger("click");
|
|
expect(wrapper.emitted()).toHaveProperty("close");
|
|
} else {
|
|
// If we can't find a button at all, mark this test as pending
|
|
console.warn("Could not find close button in component");
|
|
}
|
|
});
|
|
|
|
it("should trigger copyLatLng when location is clicked", async () => {
|
|
// Find the location item by its class
|
|
const clickableItems = wrapper.findAll(".clickable");
|
|
if (clickableItems.length > 0) {
|
|
await clickableItems[0].trigger("click");
|
|
expect(mockModel.copyLatLng).toHaveBeenCalled();
|
|
}
|
|
});
|
|
|
|
it("should handle model without taken time", () => {
|
|
const modelWithoutTime = {
|
|
...mockModel,
|
|
TakenAtLocal: null,
|
|
};
|
|
|
|
const formattedTime = wrapper.vm.formatTime(modelWithoutTime);
|
|
expect(formattedTime).toBe("Unknown");
|
|
});
|
|
});
|