mirror of
https://github.com/Dokploy/dokploy.git
synced 2026-06-20 14:45:42 +02:00
295 lines
7.3 KiB
TypeScript
295 lines
7.3 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
// Type definitions matching the project structure
|
|
type Environment = {
|
|
environmentId: string;
|
|
name: string;
|
|
isDefault: boolean;
|
|
};
|
|
|
|
type Project = {
|
|
projectId: string;
|
|
name: string;
|
|
environments: Environment[];
|
|
};
|
|
|
|
/**
|
|
* Helper function that selects the appropriate environment for a user
|
|
* This matches the logic used in search-command.tsx and show.tsx
|
|
*/
|
|
function selectAccessibleEnvironment(
|
|
project: Project | null | undefined,
|
|
): Environment | null {
|
|
if (!project || !project.environments || project.environments.length === 0) {
|
|
return null;
|
|
}
|
|
|
|
// Find default environment from accessible environments, or fall back to first accessible environment
|
|
const defaultEnvironment =
|
|
project.environments.find((environment) => environment.isDefault) ||
|
|
project.environments[0];
|
|
|
|
return defaultEnvironment || null;
|
|
}
|
|
|
|
describe("Environment Access Fallback", () => {
|
|
describe("selectAccessibleEnvironment", () => {
|
|
it("should return default environment when user has access to it", () => {
|
|
const project: Project = {
|
|
projectId: "proj-1",
|
|
name: "Test Project",
|
|
environments: [
|
|
{
|
|
environmentId: "env-prod",
|
|
name: "production",
|
|
isDefault: true,
|
|
},
|
|
{
|
|
environmentId: "env-dev",
|
|
name: "development",
|
|
isDefault: false,
|
|
},
|
|
],
|
|
};
|
|
|
|
const result = selectAccessibleEnvironment(project);
|
|
|
|
expect(result).not.toBeNull();
|
|
expect(result?.environmentId).toBe("env-prod");
|
|
expect(result?.isDefault).toBe(true);
|
|
});
|
|
|
|
it("should return first accessible environment when user doesn't have access to default", () => {
|
|
// Simulating filtered environments (user only has access to development)
|
|
const project: Project = {
|
|
projectId: "proj-1",
|
|
name: "Test Project",
|
|
environments: [
|
|
// Note: production is not in the list because user doesn't have access
|
|
{
|
|
environmentId: "env-dev",
|
|
name: "development",
|
|
isDefault: false,
|
|
},
|
|
{
|
|
environmentId: "env-staging",
|
|
name: "staging",
|
|
isDefault: false,
|
|
},
|
|
],
|
|
};
|
|
|
|
const result = selectAccessibleEnvironment(project);
|
|
|
|
expect(result).not.toBeNull();
|
|
expect(result?.environmentId).toBe("env-dev");
|
|
expect(result?.name).toBe("development");
|
|
});
|
|
|
|
it("should return first environment when no default is marked but environments exist", () => {
|
|
const project: Project = {
|
|
projectId: "proj-1",
|
|
name: "Test Project",
|
|
environments: [
|
|
{
|
|
environmentId: "env-dev",
|
|
name: "development",
|
|
isDefault: false,
|
|
},
|
|
{
|
|
environmentId: "env-staging",
|
|
name: "staging",
|
|
isDefault: false,
|
|
},
|
|
],
|
|
};
|
|
|
|
const result = selectAccessibleEnvironment(project);
|
|
|
|
expect(result).not.toBeNull();
|
|
expect(result?.environmentId).toBe("env-dev");
|
|
});
|
|
|
|
it("should return null when project has no accessible environments", () => {
|
|
const project: Project = {
|
|
projectId: "proj-1",
|
|
name: "Test Project",
|
|
environments: [],
|
|
};
|
|
|
|
const result = selectAccessibleEnvironment(project);
|
|
|
|
expect(result).toBeNull();
|
|
});
|
|
|
|
it("should return null when project is null", () => {
|
|
const result = selectAccessibleEnvironment(null);
|
|
|
|
expect(result).toBeNull();
|
|
});
|
|
|
|
it("should return null when project is undefined", () => {
|
|
const result = selectAccessibleEnvironment(undefined);
|
|
|
|
expect(result).toBeNull();
|
|
});
|
|
|
|
it("should handle project with single accessible environment", () => {
|
|
const project: Project = {
|
|
projectId: "proj-1",
|
|
name: "Test Project",
|
|
environments: [
|
|
{
|
|
environmentId: "env-dev",
|
|
name: "development",
|
|
isDefault: false,
|
|
},
|
|
],
|
|
};
|
|
|
|
const result = selectAccessibleEnvironment(project);
|
|
|
|
expect(result).not.toBeNull();
|
|
expect(result?.environmentId).toBe("env-dev");
|
|
});
|
|
|
|
it("should prioritize default environment even when it's not first in the array", () => {
|
|
const project: Project = {
|
|
projectId: "proj-1",
|
|
name: "Test Project",
|
|
environments: [
|
|
{
|
|
environmentId: "env-dev",
|
|
name: "development",
|
|
isDefault: false,
|
|
},
|
|
{
|
|
environmentId: "env-staging",
|
|
name: "staging",
|
|
isDefault: false,
|
|
},
|
|
{
|
|
environmentId: "env-prod",
|
|
name: "production",
|
|
isDefault: true,
|
|
},
|
|
],
|
|
};
|
|
|
|
const result = selectAccessibleEnvironment(project);
|
|
|
|
expect(result).not.toBeNull();
|
|
expect(result?.environmentId).toBe("env-prod");
|
|
expect(result?.isDefault).toBe(true);
|
|
});
|
|
|
|
it("should handle multiple default environments by returning the first one found", () => {
|
|
// Edge case: multiple environments marked as default (shouldn't happen, but test it)
|
|
const project: Project = {
|
|
projectId: "proj-1",
|
|
name: "Test Project",
|
|
environments: [
|
|
{
|
|
environmentId: "env-prod-1",
|
|
name: "production-1",
|
|
isDefault: true,
|
|
},
|
|
{
|
|
environmentId: "env-prod-2",
|
|
name: "production-2",
|
|
isDefault: true,
|
|
},
|
|
],
|
|
};
|
|
|
|
const result = selectAccessibleEnvironment(project);
|
|
|
|
expect(result).not.toBeNull();
|
|
expect(result?.isDefault).toBe(true);
|
|
// Should return the first default found
|
|
expect(result?.environmentId).toBe("env-prod-1");
|
|
});
|
|
|
|
it("should work correctly when user has access to multiple environments including default", () => {
|
|
const project: Project = {
|
|
projectId: "proj-1",
|
|
name: "Test Project",
|
|
environments: [
|
|
{
|
|
environmentId: "env-prod",
|
|
name: "production",
|
|
isDefault: true,
|
|
},
|
|
{
|
|
environmentId: "env-dev",
|
|
name: "development",
|
|
isDefault: false,
|
|
},
|
|
{
|
|
environmentId: "env-staging",
|
|
name: "staging",
|
|
isDefault: false,
|
|
},
|
|
],
|
|
};
|
|
|
|
const result = selectAccessibleEnvironment(project);
|
|
|
|
expect(result).not.toBeNull();
|
|
expect(result?.environmentId).toBe("env-prod");
|
|
expect(result?.isDefault).toBe(true);
|
|
});
|
|
|
|
it("should handle real-world scenario: user with only development access", () => {
|
|
// This simulates the exact bug we're fixing:
|
|
// User has access to development but not production (default)
|
|
// The filtered environments array only contains development
|
|
const project: Project = {
|
|
projectId: "proj-1",
|
|
name: "My Project",
|
|
environments: [
|
|
// Only development is accessible (production was filtered out)
|
|
{
|
|
environmentId: "env-dev-123",
|
|
name: "development",
|
|
isDefault: false,
|
|
},
|
|
],
|
|
};
|
|
|
|
const result = selectAccessibleEnvironment(project);
|
|
|
|
expect(result).not.toBeNull();
|
|
expect(result?.environmentId).toBe("env-dev-123");
|
|
expect(result?.name).toBe("development");
|
|
// Should not be null even though it's not the default
|
|
});
|
|
});
|
|
|
|
describe("Environment selection edge cases", () => {
|
|
it("should handle project with environments property as undefined", () => {
|
|
const project = {
|
|
projectId: "proj-1",
|
|
name: "Test Project",
|
|
environments: undefined,
|
|
} as unknown as Project;
|
|
|
|
const result = selectAccessibleEnvironment(project);
|
|
|
|
expect(result).toBeNull();
|
|
});
|
|
|
|
it("should handle project with null environments array", () => {
|
|
const project = {
|
|
projectId: "proj-1",
|
|
name: "Test Project",
|
|
environments: null,
|
|
} as unknown as Project;
|
|
|
|
const result = selectAccessibleEnvironment(project);
|
|
|
|
expect(result).toBeNull();
|
|
});
|
|
});
|
|
});
|