diff --git a/.editorconfig b/.editorconfig index 0c8f06640..05116e70f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,12 +2,20 @@ root = true [*] trim_trailing_whitespace = true +end_of_line = lf +insert_final_newline = true [*.{js,php,html}] indent_style = space indent_size = 4 charset = utf-8 +[*.bats] +indent_style = space +indent_size = 2 +charset = utf-8 + [Makefile] indent_style = tab indent_size = 4 + diff --git a/.github/workflows/api-integration-tests.yml b/.github/workflows/api-integration-tests.yml index 29df1d65d..569397b57 100644 --- a/.github/workflows/api-integration-tests.yml +++ b/.github/workflows/api-integration-tests.yml @@ -55,6 +55,9 @@ jobs: extensions: pdo_sqlite,pdo_mysql,pdo_pgsql,gd,zip coverage: none + - name: Setup BATS + uses: mig4/setup-bats@v1 + ### MySQL specific setup - name: Setup mysql if: matrix.database == 'mysql' @@ -112,46 +115,14 @@ jobs: ./occ migrations:migrate news ./occ maintenance:repair - - name: Functional tests explore + - name: Functional tests working-directory: ../server - run: ./occ news:generate-explore --votes 100 "https://nextcloud.com/blog/feed/" - - - name: Functional tests folder - working-directory: ../server - run: | - ./occ news:folder:add 'admin' 'Something' - ./occ news:folder:list 'admin' | grep 'Something' - - - name: Functional tests feed - working-directory: ../server - run: | - ./occ news:feed:add 'admin' "https://nextcloud.com/blog/feed/" - ./occ news:feed:add 'admin' "https://github.com/nextcloud/news/releases.atom" - ./occ news:feed:list 'admin' | grep 'nextcloud\.com' - ./occ news:feed:list 'admin' | grep -F '"faviconLink": "https:\/\/nextcloud.com\/media\/screenshot-150x150.png"' - - - name: Functional tests items - working-directory: ../server - run: | - TAG=$(curl --silent "https://api.github.com/repos/nextcloud/news/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') - ./occ news:item:list-feed "admin" $(./occ news:feed:list 'admin' | grep 'github\.com' -1 | head -1 | grep -oE '[0-9]*') --limit 200 | grep "$TAG" - ./occ news:item:list-folder "admin" --limit 200 | grep "$TAG" - ./occ news:item:list "admin" --limit 200 | grep "$TAG" - - - name: Functional tests opml - working-directory: ../server - run: ./occ news:opml:export 'admin' | grep 'nextcloud\.com' - - - name: Functional tests cleanup - working-directory: ../server - run: | - ./occ news:folder:delete 'admin' $(./occ news:folder:list 'admin' | grep 'Something' -1 | head -1 | grep -oE '[0-9]*') - ./occ news:feed:delete 'admin' $(./occ news:feed:list 'admin' | grep 'nextcloud\.com' -1 | head -1 | grep -oE '[0-9]*') - ./occ news:feed:delete 'admin' $(./occ news:feed:list 'admin' | grep 'github\.com' -1 | head -1 | grep -oE '[0-9]*') + run: bats apps/news/tests/integration - name: Prep PHP tests working-directory: ../server/apps/news run: make php-test-dependencies + - name: Feed tests working-directory: ../server/apps/news run: make feed-test diff --git a/CHANGELOG.md b/CHANGELOG.md index 62b3357bd..0cf70cab9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ The format is almost based on [Keep a Changelog](https://keepachangelog.com/en/1 ## [Unreleased] ### Changed +- Add BATS as integration tests ### Fixed diff --git a/lib/Command/Config/FolderAdd.php b/lib/Command/Config/FolderAdd.php index 503d63a31..2d20064ab 100644 --- a/lib/Command/Config/FolderAdd.php +++ b/lib/Command/Config/FolderAdd.php @@ -55,7 +55,9 @@ class FolderAdd extends Command $parent = intval($parent); } - $this->folderService->create($user, $name, $parent); + $folder = $this->folderService->create($user, $name, $parent); + + $output->writeln('new folder: ' . $folder->getId()); return 0; } diff --git a/tests/integration/explore.bats b/tests/integration/explore.bats new file mode 100644 index 000000000..7407dc8a8 --- /dev/null +++ b/tests/integration/explore.bats @@ -0,0 +1,12 @@ +#!/usr/bin/env bats + +load "helpers/settings" + +TESTSUITE="Explore" + +@test "[$TESTSUITE] Create new" { + curl --fail "$NC_FEED" + + run ./occ news:generate-explore --votes 100 "$NC_FEED" + [ "$status" -eq 0 ] +} \ No newline at end of file diff --git a/tests/integration/feeds.bats b/tests/integration/feeds.bats new file mode 100644 index 000000000..d8f0aad8c --- /dev/null +++ b/tests/integration/feeds.bats @@ -0,0 +1,71 @@ +#!/usr/bin/env bats + +load "helpers/settings" + +TESTSUITE="Feeds" + +teardown() { + ID=$(./occ news:feed:list 'admin' | grep "Something-${BATS_SUITE_TEST_NUMBER}" -2 | head -1 | grep -oE '[0-9]*') + if [ -n "$ID" ]; then + ./occ news:feed:delete "$user" "$ID" + fi +} + +@test "[$TESTSUITE] Create new" { + run "./occ" news:feed:add "$user" "$NC_FEED" + [ "$status" -eq 0 ] + + if ! echo "$output" | grep '"ID":'; then + ret_status=$? + echo "Feed ID not returned" + return $ret_status + fi +} + +@test "[$TESTSUITE] List all" { + ./occ news:feed:add "$user" "$NC_FEED" --title "Something-${BATS_SUITE_TEST_NUMBER}" + + run ./occ news:feed:list "$user" + [ "$status" -eq 0 ] + + if ! echo "$output" | grep "Something-${BATS_SUITE_TEST_NUMBER}"; then + ret_status=$? + echo "Feed not found in list" + return $ret_status + fi + + if ! echo "$output" | grep -F '"faviconLink": "https:\/\/nextcloud.com\/media\/screenshot-150x150.png"'; then + ret_status=$? + echo "Favicon not found in list" + return $ret_status + fi +} + +@test "[$TESTSUITE] List all items" { + ./occ news:feed:add "$user" "https://github.com/nextcloud/news/releases.atom" --title "Something-${BATS_SUITE_TEST_NUMBER}" + + TAG=$(curl --silent "https://api.github.com/repos/nextcloud/news/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') + ID=$(./occ news:feed:list 'admin' | grep 'github\.com' -1 | head -1 | grep -oE '[0-9]*') + + run ./occ news:item:list-feed "$user" "$ID" --limit 200 + [ "$status" -eq 0 ] + + if ! echo "$output" | grep "$TAG"; then + ret_status=$? + echo "Release not found in list" + return $ret_status + fi +} + +@test "[$TESTSUITE] Delete all" { + ./occ news:feed:add "$user" "$NC_FEED" --title "Something-${BATS_SUITE_TEST_NUMBER}" + + run ./occ news:feed:list "$user" + [ "$status" -eq 0 ] + + echo "$output" | grep "Something-${BATS_SUITE_TEST_NUMBER}" + + ID=$(./occ news:feed:list 'admin' | grep "Something-${BATS_SUITE_TEST_NUMBER}" -2 | head -1 | grep -oE '[0-9]*') + run ./occ news:feed:delete "$user" "$ID" + [ "$status" -eq 0 ] +} \ No newline at end of file diff --git a/tests/integration/folders.bats b/tests/integration/folders.bats new file mode 100644 index 000000000..9dde06861 --- /dev/null +++ b/tests/integration/folders.bats @@ -0,0 +1,49 @@ +#!/usr/bin/env bats + +load "helpers/settings" + +TESTSUITE="Folders" + +teardown() { + ID=$(./occ news:folder:list 'admin' | grep "Something-${BATS_SUITE_TEST_NUMBER}" -1 | head -1 | grep -oE '[0-9]*') + if [ -n "$ID" ]; then + ./occ news:folder:delete "$user" "$ID" + fi +} + +@test "[$TESTSUITE] Create new" { + run ./occ news:folder:add "$user" "Something-${BATS_SUITE_TEST_NUMBER}" + [ "$status" -eq 0 ] + + + if echo "$output" | grep 'new folder'; then + ret_status=$? + echo "Folder ID not returned" + return $ret_status + fi +} + +@test "[$TESTSUITE] List all" { + ./occ news:folder:add "$user" "Something-${BATS_SUITE_TEST_NUMBER}" + + run ./occ news:folder:list "$user" + [ "$status" -eq 0 ] + + if echo "$output" | grep "Something-${BATS_SUITE_TEST_NUMBER}"; then + ret_status=$? + echo "Folder not found in list" + return $ret_status + fi +} + +@test "[$TESTSUITE] Delete all" { + ID=$(./occ news:folder:add "$user" "Something-${BATS_SUITE_TEST_NUMBER}" | grep -oE '[0-9]*') + + run ./occ news:folder:list "$user" + [ "$status" -eq 0 ] + + echo "$output" | grep "Something-${BATS_SUITE_TEST_NUMBER}" + + run ./occ news:folder:delete "$user" "$ID" + [ "$status" -eq 0 ] +} \ No newline at end of file diff --git a/tests/integration/helpers/settings.bash b/tests/integration/helpers/settings.bash new file mode 100644 index 000000000..48b5a3726 --- /dev/null +++ b/tests/integration/helpers/settings.bash @@ -0,0 +1,2 @@ +user=admin +NC_FEED="https://nextcloud.com/blog/static-feed/" \ No newline at end of file diff --git a/tests/integration/items.bats b/tests/integration/items.bats new file mode 100644 index 000000000..e85c8956c --- /dev/null +++ b/tests/integration/items.bats @@ -0,0 +1,51 @@ +#!/usr/bin/env bats + +load "helpers/settings" + +TESTSUITE="Items" + +setup() { + ./occ news:feed:add "$user" "https://github.com/nextcloud/news/releases.atom" --title "Something-${BATS_SUITE_TEST_NUMBER}" + + TAG=$(curl --silent "https://api.github.com/repos/nextcloud/news/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') + ID=$(./occ news:feed:list 'admin' | grep 'github\.com' -1 | head -1 | grep -oE '[0-9]*') +} + +teardown() { + if [ -n "$ID" ]; then + ./occ news:feed:delete "$user" "$ID" + fi +} + +@test "[$TESTSUITE] List all items in feed" { + run ./occ news:item:list-feed "$user" "$ID" --limit 200 + [ "$status" -eq 0 ] + + if ! echo "$output" | grep "$TAG"; then + ret_status=$? + echo "Release not found in feed list" + return $ret_status + fi +} + +@test "[$TESTSUITE] List all items in folder" { + run ./occ news:item:list-folder "$user" --limit 200 + [ "$status" -eq 0 ] + + if ! echo "$output" | grep "$TAG"; then + ret_status=$? + echo "Release not found in folder list" + return $ret_status + fi +} + +@test "[$TESTSUITE] List all items" { + run ./occ news:item:list "$user" --limit 200 + [ "$status" -eq 0 ] + + if ! echo "$output" | grep "$TAG"; then + ret_status=$? + echo "Release not found in list" + return $ret_status + fi +} \ No newline at end of file diff --git a/tests/integration/opml.bats b/tests/integration/opml.bats new file mode 100644 index 000000000..b2d576e8e --- /dev/null +++ b/tests/integration/opml.bats @@ -0,0 +1,26 @@ +#!/usr/bin/env bats + +load "helpers/settings" + +TESTSUITE="OPML" + +teardown() { + ID=$(./occ news:feed:list 'admin' | grep "Something-${BATS_SUITE_TEST_NUMBER}" -1 | head -1 | grep -oE '[0-9]*') + if [ -n "$ID" ]; then + ./occ news:feed:delete "$user" "$ID" + fi +} + +@test "[$TESTSUITE] Export" { + run ./occ news:feed:add "$user" "https://nextcloud.com/blog/static-feed/" + [ "$status" -eq 0 ] + + run ./occ news:opml:export "$user" + [ "$status" -eq 0 ] + + if ! echo "$output" | grep "https://nextcloud.com/"; then + ret_status=$? + echo "Feed not exported" + return $ret_status + fi +} \ No newline at end of file