package projectdetect import ( "testing" "dappco.re/go/core/build/internal/ax" "dappco.re/go/core/build/pkg/build" "dappco.re/go/core/io" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestDetectProjectType_Good(t *testing.T) { fs := io.Local t.Run("prefers core marker types over fallback builders", func(t *testing.T) { dir := t.TempDir() require.NoError(t, ax.WriteFile(ax.Join(dir, "go.mod"), []byte("module example"), 0o644)) require.NoError(t, ax.WriteFile(ax.Join(dir, "Dockerfile"), []byte("FROM alpine"), 0o644)) projectType, err := DetectProjectType(fs, dir) require.NoError(t, err) assert.Equal(t, build.ProjectTypeGo, projectType) }) t.Run("detects Go workspaces", func(t *testing.T) { dir := t.TempDir() require.NoError(t, ax.WriteFile(ax.Join(dir, "go.work"), []byte("go 1.22\nuse ./app"), 0o644)) projectType, err := DetectProjectType(fs, dir) require.NoError(t, err) assert.Equal(t, build.ProjectTypeGo, projectType) }) t.Run("detects Docker projects", func(t *testing.T) { dir := t.TempDir() require.NoError(t, ax.WriteFile(ax.Join(dir, "Dockerfile"), []byte("FROM alpine"), 0o644)) projectType, err := DetectProjectType(fs, dir) require.NoError(t, err) assert.Equal(t, build.ProjectTypeDocker, projectType) }) t.Run("detects LinuxKit projects", func(t *testing.T) { dir := t.TempDir() linuxkitDir := ax.Join(dir, ".core", "linuxkit") require.NoError(t, ax.MkdirAll(linuxkitDir, 0o755)) require.NoError(t, ax.WriteFile(ax.Join(linuxkitDir, "server.yml"), []byte("kernel:\n image: test"), 0o644)) projectType, err := DetectProjectType(fs, dir) require.NoError(t, err) assert.Equal(t, build.ProjectTypeLinuxKit, projectType) }) t.Run("detects C++ projects", func(t *testing.T) { dir := t.TempDir() require.NoError(t, ax.WriteFile(ax.Join(dir, "CMakeLists.txt"), []byte("cmake_minimum_required(VERSION 3.16)"), 0o644)) projectType, err := DetectProjectType(fs, dir) require.NoError(t, err) assert.Equal(t, build.ProjectTypeCPP, projectType) }) t.Run("detects Taskfile projects", func(t *testing.T) { dir := t.TempDir() require.NoError(t, ax.WriteFile(ax.Join(dir, "Taskfile.yml"), []byte("version: '3'"), 0o644)) projectType, err := DetectProjectType(fs, dir) require.NoError(t, err) assert.Equal(t, build.ProjectTypeTaskfile, projectType) }) t.Run("detects nested Node.js projects", func(t *testing.T) { dir := t.TempDir() nested := ax.Join(dir, "apps", "web") require.NoError(t, ax.MkdirAll(nested, 0o755)) require.NoError(t, ax.WriteFile(ax.Join(nested, "package.json"), []byte("{}"), 0o644)) projectType, err := DetectProjectType(fs, dir) require.NoError(t, err) assert.Equal(t, build.ProjectTypeNode, projectType) }) } func TestDetectProjectType_Bad(t *testing.T) { fs := io.Local t.Run("returns empty type for empty directory", func(t *testing.T) { projectType, err := DetectProjectType(fs, t.TempDir()) require.NoError(t, err) assert.Empty(t, projectType) }) }