#!/usr/bin/env bats # tests/unit/sync.bats — Sync/import algorithm tests setup() { export JOSH_SYNC_ROOT="$(cd "$BATS_TEST_DIRNAME/../.." && pwd)" source "$JOSH_SYNC_ROOT/lib/core.sh" source "$JOSH_SYNC_ROOT/lib/sync.sh" TEST_ROOT="$(mktemp -d)" export BOT_NAME="test-bot" export BOT_EMAIL="test-bot@test.local" export BOT_TRAILER="Josh-Sync-Origin" export GITEA_TOKEN="test-token" export MONOREPO_API="https://gitea.test.local/api/v1/repos/org/mono" export JOSH_SYNC_TARGET_NAME="crm" export JOSH_SYNC_TARGETS='[{"name":"crm","subfolder":"apps/crm"}]' export SYNC_BRANCH_MONO="main" export SYNC_BRANCH_SUBREPO="main" } teardown() { rm -rf "$TEST_ROOT" } make_mono_repo() { local work="${TEST_ROOT}/mono-work" local bare="${TEST_ROOT}/mono.git" git init "$work" >/dev/null git -C "$work" checkout -b main >/dev/null git -C "$work" config user.name "Test User" git -C "$work" config user.email "test@test.local" printf 'mono\n' > "${work}/README.md" git -C "$work" add README.md git -C "$work" commit -m "mono base" >/dev/null git init --bare "$bare" >/dev/null git -C "$work" remote add origin "$bare" git -C "$work" push origin main >/dev/null printf '%s\n' "$bare" } make_subrepo_with_tracked_ignored_file() { local work="${TEST_ROOT}/subrepo-work" local bare="${TEST_ROOT}/subrepo.git" git init "$work" >/dev/null git -C "$work" checkout -b main >/dev/null git -C "$work" config user.name "Test User" git -C "$work" config user.email "test@test.local" mkdir -p "${work}/.dependencies" printf '.dependencies/\n' > "${work}/.gitignore" printf 'visible\n' > "${work}/visible.txt" printf 'tracked even though ignored\n' > "${work}/.dependencies/tracked.txt" git -C "$work" add .gitignore visible.txt git -C "$work" add -f .dependencies/tracked.txt git -C "$work" commit -m "subrepo with tracked ignored file" >/dev/null git init --bare "$bare" >/dev/null git -C "$work" remote add origin "$bare" git -C "$work" push origin main >/dev/null printf '%s\n' "$bare" } mono_auth_url() { printf '%s\n' "$MONO_BARE" } subrepo_auth_url() { printf '%s\n' "$SUBREPO_BARE" } create_pr() { printf '%s\n' "$4" > "${TEST_ROOT}/created-pr-head" } @test "initial_import stages files tracked in subrepo even when ignored by copied .gitignore" { MONO_BARE="$(make_mono_repo)" SUBREPO_BARE="$(make_subrepo_with_tracked_ignored_file)" local result import_branch result="$(initial_import)" import_branch="$(cat "${TEST_ROOT}/created-pr-head")" [ "$result" = "pr-created" ] git --git-dir="$MONO_BARE" ls-tree -r --name-only "$import_branch" \ | grep -q '^apps/crm/.dependencies/tracked.txt$' }