Skip to content

Implement half of tests in Bats #1187

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Mar 12, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,11 @@ trim_trailing_whitespace = false

[*.py]
indent_size = 4

[*.bats]
indent_style = tab
indent_size = 4

[tests/*.sh]
indent_style = tab
indent_size = 4
15 changes: 13 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,22 +70,33 @@ jobs:

steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install poetry
run: pip install poetry
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'poetry'
cache-dependency-path: "tests/pyproject.toml"
python-version-file: "tests/pyproject.toml"
- name: Install dependencies
- name: Install Python Dependencies
run: |
cd tests || exit
poetry install --only test
- name: Unit test
- name: Setup Bats
id: setup-bats
uses: bats-core/[email protected]
- name: Test with Pytest
run: |
cd tests
poetry run pytest
- name: Test with Bats
env:
BATS_LIB_PATH: ${{ steps.setup-bats.outputs.lib-path }}
TERM: xterm
run: bats ./tests

build:
strategy:
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "vendor/bats-all"]
path = vendor/bats-all
url = https://github.com/hyperupcall/bats-all
93 changes: 93 additions & 0 deletions tests/git-abort.bats
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# shellcheck shell=bash

source "$BATS_TEST_DIRNAME/test_util.sh"

setup_file() {
test_util.setup_file
}

setup() {
test_util.cd_test

git init
git commit --allow-empty -m "Initial commit"
git branch A
git branch B
git checkout A
printf '%s\n' 'a' > tmpfile
git add .
git commit -m A
git checkout B
printf '%s\n' 'b' > tmpfile
git add .
git commit -m B
git status
}

@test "cherry pick" {
run git cherry-pick A
assert_failure

run git status
assert_line -p 'You are currently cherry-picking commit'
assert_line -p 'Unmerged paths:'
assert_success

run git abort
assert_success

run git status
assert_line -p 'nothing to commit, working tree clean'
assert_success
}

@test "merge" {
run git merge A
assert_failure

run git status
assert_line -p 'You have unmerged paths'
assert_line -p 'Unmerged paths:'
assert_success

run git abort
assert_success

run git status
assert_line -p 'nothing to commit, working tree clean'
assert_success
}

@test "rebase" {
run git rebase A
assert_failure

run git status
assert_line -p 'You are currently rebasing branch'
assert_line -p 'Unmerged paths:'
assert_success

run git abort
assert_success

run git status
assert_line -p 'nothing to commit, working tree clean'
assert_success
}

@test "revert" {
run git revert A
assert_failure

run git status
assert_line -p 'You are currently reverting commit'
assert_line -p 'Unmerged paths:'
assert_success

run git abort
assert_success

run git status
assert_line -p 'nothing to commit, working tree clean'
assert_success
}
106 changes: 106 additions & 0 deletions tests/git-alias.bats
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# shellcheck shell=bash

source "$BATS_TEST_DIRNAME/test_util.sh"

setup_file() {
test_util.setup_file
}

setup() {
test_util.cd_test

git init
git config --global alias.globalalias status
git config --global alias.x status
git config --local alias.localalias status
git config --local alias.y status
}

@test "list all works" {
run git alias
assert_output - <<-'EOF'
globalalias = status
localalias = status
x = status
y = status
EOF
assert_success
}

@test "list all globally works" {
run git alias --global
assert_output - <<-'EOF'
globalalias = status
x = status
EOF
assert_success
}

@test "list all locally works" {
run git alias --local
assert_output - <<-'EOF'
localalias = status
y = status
EOF
assert_success
}

@test "search globally works" {
run git alias --global global
assert_output - <<-'EOF'
globalalias = status
EOF
assert_success

run git alias --global local
assert_output ''
assert_failure
}

@test "search locally works" {
run git alias --local local
assert_output - <<-'EOF'
localalias = status
EOF
assert_success

run git alias --local global
assert_output ''
assert_failure
}

@test "get alias globally and defaultly" {
run git alias globalalias
assert_output - <<-'EOF'
globalalias = status
EOF
assert_success
}

@test "set alias globally and defaultly" {
git alias globalalias diff
run git alias diff
assert_output - <<-'EOF'
globalalias = diff
EOF
assert_success
}

@test "get alias locally" {
run git alias --local localalias
assert_output - <<-'EOF'
localalias = status
EOF
assert_success
}

@test "set alias locally" {
git alias --local localalias diff
run git alias
assert_output - <<-'EOF'
globalalias = status
localalias = diff
x = status
y = status
EOF
}
66 changes: 66 additions & 0 deletions tests/git-archive-file.bats
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# shellcheck shell=bash

source "$BATS_TEST_DIRNAME/test_util.sh"

setup_file() {
test_util.setup_file
}

setup() {
test_util.cd_test

git init
printf '%s\n' 'data' > tmpfile
git add .
git commit -m 'test: add data'
git tag 0.1.0 -m 'bump: 0.1.0'
}

@test "archive file on tags branch" {
git checkout -b tags0.1.0
run git archive-file
assert_success

local describe_output=
describe_output=$(git describe)
assert_file_exists "${PWD##*/}.$describe_output.zip"
}

@test "archive file on any not tags branch without default branch" {
git checkout -b not-tags-branch
run git archive-file
assert_success

local describe_output=
describe_output=$(git describe --always --long)
assert_file_exists "${PWD##*/}.$describe_output.not-tags-branch.zip"
}

@test "archive file on any not tags branch with default branch" {
skip "Not working as expected"

run git archive-file
assert_success

local describe_output=
describe_output=$(git describe --always --long)
assert_file_exists "${PWD##*/}.$describe_output.zip"
}

@test "archive file on branch name has slash" {
git checkout -b feature/slash
run git archive-file
assert_success

local describe_output=
describe_output=$(git describe --always --long)
assert_file_exists "${PWD##*/}.$describe_output.feature-slash.zip"
}

@test "archive file on dirname has backslash" {
skip
}

@test "archive file on tag name has slash" {
skip
}
52 changes: 52 additions & 0 deletions tests/git-authors.bats
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# shellcheck shell=bash

source "$BATS_TEST_DIRNAME/test_util.sh"


setup_file() {
test_util.setup_file
}

setup() {
test_util.cd_test

git init
GIT_CONFIG_VALUE_0='[email protected]'
GIT_CONFIG_VALUE_1='test'
printf '%s\n' 'A' > tmpfile
git add .
git commit -m 'test: add data A'
GIT_CONFIG_VALUE_0='[email protected]'
GIT_CONFIG_VALUE_1='testagain'
printf '%s\n' 'B' > tmpfile
git add .
git commit -m 'test: add data B'
}

@test "output authors has email without any parameter" {
run git authors
assert_success

local content=$(<AUTHORS)
assert_equal "$content" $'test <[email protected]>\ntestagain <[email protected]>'
}

@test "list authors has email defaultly" {
run git authors --list
assert_output $'test <[email protected]>\ntestagain <[email protected]>'
assert_success

run git authors -l
assert_output $'test <[email protected]>\ntestagain <[email protected]>'
assert_success
}

@test "list authors has no email" {
run git authors --list --no-email
assert_output $'test\ntestagain'
assert_success

run git authors -l --no-email
assert_output $'test\ntestagain'
assert_success
}
26 changes: 26 additions & 0 deletions tests/test_util.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# shellcheck shell=bash

source "$BATS_TEST_DIRNAME/../vendor/bats-all/load.bash"

test_util.setup_file() {
cd "$BATS_FILE_TMPDIR"

export GIT_CONFIG_NOSYSTEM=1
export GIT_CONFIG_GLOBAL="$PWD/git_config"
export GIT_CONFIG_COUNT=3
export GIT_CONFIG_KEY_0="user.email"
export GIT_CONFIG_VALUE_0="[email protected]"
export GIT_CONFIG_KEY_1="user.name"
export GIT_CONFIG_VALUE_1="Name"
# This removes default warning about default "master" branch on some Git versions.
export GIT_CONFIG_KEY_2="init.defaultBranch"
export GIT_CONFIG_VALUE_2="main"

# Append to path so that we can access all commands included from git-extras
# TODO: This currently breaks with commands that are included in "not_needed_git_repo" etc.
PATH="$BATS_TEST_DIRNAME/../bin:$PATH"
}

test_util.cd_test() {
cd "$BATS_TEST_TMPDIR"
}
Loading
Loading