From eca96ad37d89b442ae4e0463ec8f7a5bee3007f1 Mon Sep 17 00:00:00 2001 From: Benjamin Brahmer Date: Sun, 29 May 2022 11:25:38 +0200 Subject: Enable API testing (#1699) Enable API testing with local php server. This adds many tests for API v1.2, more still possible. Which increased the quality of news already. Signed-off-by: Benjamin Brahmer --- .github/workflows/api-integration-tests.yml | 24 ++++- .gitignore | 3 + .gitmodules | 6 ++ tests/api/feeds.bats | 137 ++++++++++++++++++++++++++++ tests/api/folders.bats | 89 ++++++++++++++++++ tests/api/helpers/settings.bash | 4 + tests/api/items.bats | 66 ++++++++++++++ tests/command/explore.bats | 12 +++ tests/command/feeds.bats | 116 +++++++++++++++++++++++ tests/command/folders.bats | 64 +++++++++++++ tests/command/helpers/settings.bash | 4 + tests/command/items.bats | 84 +++++++++++++++++ tests/command/opml.bats | 26 ++++++ tests/integration/explore.bats | 12 --- tests/integration/feeds.bats | 116 ----------------------- tests/integration/folders.bats | 64 ------------- tests/integration/helpers/settings.bash | 4 - tests/integration/items.bats | 84 ----------------- tests/integration/opml.bats | 26 ------ tests/test_helper/bats-assert | 1 + tests/test_helper/bats-support | 1 + 21 files changed, 632 insertions(+), 311 deletions(-) create mode 100644 .gitmodules create mode 100644 tests/api/feeds.bats create mode 100644 tests/api/folders.bats create mode 100644 tests/api/helpers/settings.bash create mode 100644 tests/api/items.bats create mode 100644 tests/command/explore.bats create mode 100644 tests/command/feeds.bats create mode 100644 tests/command/folders.bats create mode 100644 tests/command/helpers/settings.bash create mode 100644 tests/command/items.bats create mode 100644 tests/command/opml.bats delete mode 100644 tests/integration/explore.bats delete mode 100644 tests/integration/feeds.bats delete mode 100644 tests/integration/folders.bats delete mode 100644 tests/integration/helpers/settings.bash delete mode 100644 tests/integration/items.bats delete mode 100644 tests/integration/opml.bats create mode 160000 tests/test_helper/bats-assert create mode 160000 tests/test_helper/bats-support diff --git a/.github/workflows/api-integration-tests.yml b/.github/workflows/api-integration-tests.yml index c9a1d4cc9..117e7af49 100644 --- a/.github/workflows/api-integration-tests.yml +++ b/.github/workflows/api-integration-tests.yml @@ -33,11 +33,11 @@ jobs: database: ['sqlite', 'pgsql', 'mysql'] experimental: [false] include: - - php-versions: 8.0 + - php-versions: '8.0' nextcloud: pre-release database: sqlite experimental: true - - php-versions: 8.1 + - php-versions: '8.1' nextcloud: pre-release database: sqlite experimental: true @@ -48,6 +48,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 + with: + submodules: recursive - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -56,8 +58,8 @@ jobs: extensions: pdo_sqlite,pdo_mysql,pdo_pgsql,gd,zip coverage: none - - name: Setup BATS - uses: mig4/setup-bats@v1.2.0 + - name: Setup BATS & httpie + run: sudo apt-get install -y bats httpie ### MySQL specific setup - name: Setup mysql @@ -108,6 +110,17 @@ jobs: check-code: false force: ${{ matrix.experimental }} + - name: Run API tests + working-directory: ../server + run: | + php -S localhost:8080 &> /tmp/webserver.log & + sleep 2 + + bats apps/news/tests/api + + # Kill php server + kill %1 + - name: Setup problem matchers for PHP run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" @@ -118,7 +131,7 @@ jobs: - name: Functional tests working-directory: ../server - run: bats apps/news/tests/integration + run: bats apps/news/tests/command - name: Prep PHP tests working-directory: ../server/apps/news @@ -127,3 +140,4 @@ jobs: - name: Feed tests working-directory: ../server/apps/news run: make feed-test + diff --git a/.gitignore b/.gitignore index 44cf6f335..7f9ed3550 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,9 @@ js/*.xml .phpunit.result.cache site/ +#bats +tests/api/helpers/settings-override.bash + # python PKG-INFO *pyc diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..d74af0778 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "tests/test_helper/bats-support"] + path = tests/test_helper/bats-support + url = https://github.com/bats-core/bats-support.git +[submodule "tests/test_helper/bats-assert"] + path = tests/test_helper/bats-assert + url = https://github.com/bats-core/bats-assert.git diff --git a/tests/api/feeds.bats b/tests/api/feeds.bats new file mode 100644 index 000000000..054fd776a --- /dev/null +++ b/tests/api/feeds.bats @@ -0,0 +1,137 @@ +#!/usr/bin/env bats + +setup() { + load "../test_helper/bats-support/load" + load "../test_helper/bats-assert/load" + load "helpers/settings" + + if test -f "tests/api/helpers/settings-override.bash"; then + load "helpers/settings-override" + fi +} + +TESTSUITE="Feeds" + +teardown() { + # delete all feeds + ID_LIST=($(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/feeds | grep -Po '"id":\K([0-9]+)' | tr '\n' ' ')) + for i in $ID_LIST; do + http --ignore-stdin -b -a ${user}:${user} DELETE ${BASE_URLv1}/feeds/$i + done + + # delete all folders + ID_LIST=($(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/folders | grep -Po '"id":\K([0-9]+)' | tr '\n' ' ')) + for i in $ID_LIST; do + http --ignore-stdin -b -a ${user}:${user} DELETE ${BASE_URLv1}/folders/$i + done +} + +@test "[$TESTSUITE] Read empty" { + run http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/feeds + + assert_output --partial "\"feeds\":[]" + assert_output --partial "\"starredCount\":0" +} + +@test "[$TESTSUITE] Create new" { + # run is not working here. + output=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/feeds url=$NC_FEED | jq '.feeds | .[0].url') + + # self reference of feed is used here + assert_output '"https://nextcloud.com/feed/"' +} + +@test "[$TESTSUITE] Create new inside folder" { + # create folder and store id + ID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/folders name=news-${BATS_SUITE_TEST_NUMBER} | grep -Po '"id":\K([0-9]+)') + + # run is not working here. + output=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/feeds url=$NC_FEED folderId=$ID | jq '.feeds | .[0].folderId') + + # check if ID matches + assert_output "$ID" +} + +@test "[$TESTSUITE] Delete one" { + ID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/feeds url=$NC_FEED | grep -Po '"id":\K([0-9]+)') + + run http --ignore-stdin -b -a ${user}:${user} DELETE ${BASE_URLv1}/feeds/$ID + + assert_output "[]" +} + +@test "[$TESTSUITE] Move feed to different folder" { + # create folders and store ids + FIRST_FOLDER_ID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/folders name=news-${BATS_SUITE_TEST_NUMBER} | grep -Po '"id":\K([0-9]+)') + SECCOND_FOLDER_ID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/folders name=news-${BATS_SUITE_TEST_NUMBER} | grep -Po '"id":\K([0-9]+)') + + FEEDID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/feeds url=$NC_FEED folderId=$FIRST_FOLDER_ID | grep -Po '"id":\K([0-9]+)') + + # move feed, returns nothing + http --ignore-stdin -b -a ${user}:${user} PUT ${BASE_URLv1}/feeds/$FEEDID/move folderId=$SECCOND_FOLDER_ID + + # run is not working here. + output=$(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/feeds | jq '.feeds | .[0].folderId') + + # look for second folder id + assert_output "$SECCOND_FOLDER_ID" +} + +@test "[$TESTSUITE] Move feed to root" { + # create folder and store id + FOLDER_ID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/folders name=news-${BATS_SUITE_TEST_NUMBER} | grep -Po '"id":\K([0-9]+)') + + FEEDID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/feeds url=$NC_FEED folderId=$FOLDER_ID | grep -Po '"id":\K([0-9]+)') + + # move feed to "null", returns nothing + http --ignore-stdin -b -a ${user}:${user} PUT ${BASE_URLv1}/feeds/$FEEDID/move folderId=null + + # run is not working here. + output=$(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/feeds | jq '.feeds | .[0].folderId') + + # new "folder" should be null + assert_output null +} + +@test "[$TESTSUITE] Rename feed" { + # create feed and store id + FEEDID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/feeds url=$NC_FEED | grep -Po '"id":\K([0-9]+)') + + # rename feed, returns nothing + http --ignore-stdin -b -a ${user}:${user} PUT ${BASE_URLv1}/feeds/$FEEDID/rename feedTitle="Great Title" + + # run is not working here. + output=$(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/feeds | jq '.feeds | .[0].title') + + # Check if title matches + assert_output '"Great Title"' +} + +@test "[$TESTSUITE] Mark all items as read" { + # create feed and store id + FEEDID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/feeds url=$NC_FEED | grep -Po '"id":\K([0-9]+)') + + ID_LIST=($(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/items id=$FEEDID | grep -Po '"id":\K([0-9]+)' | tr '\n' ' ')) + + # get biggest item ID + max=${ID_LIST[0]} + for n in "${ID_LIST[@]}" ; do + ((n > max)) && max=$n + done + + # mark all items of feed as read, returns nothing + STATUS_CODE=$(http --ignore-stdin -hdo /tmp/body -a ${user}:${user} PUT ${BASE_URLv1}/feeds/$FEEDID/read newestItemId="$max" 2>&1| grep HTTP/) + + # collect unread status + unread=$(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/items id=$FEEDID | grep -Po '"unread":\K((true)|(false))' | tr '\n' ' ') + + for n in "${unread[@]}" ; do + if $n + then + echo "Item was not marked as read" + echo $STATUS_CODE + false + fi + done +} + diff --git a/tests/api/folders.bats b/tests/api/folders.bats new file mode 100644 index 000000000..710b7d2a3 --- /dev/null +++ b/tests/api/folders.bats @@ -0,0 +1,89 @@ +#!/usr/bin/env bats + +setup() { + load "../test_helper/bats-support/load" + load "../test_helper/bats-assert/load" + load "helpers/settings" + + if test -f "tests/api/helpers/settings-override.bash"; then + load "helpers/settings-override" + fi + +} + +TESTSUITE="Folders" + +teardown() { + # delete all feeds + FEED_IDS=($(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/feeds | grep -Po '"id":\K([0-9]+)' | tr '\n' ' ')) + for i in $FEED_IDS; do + http --ignore-stdin -b -a ${user}:${user} DELETE ${BASE_URLv1}/feeds/$i + done + + # delete all folders + FOLDER_IDS=($(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/folders | grep -Po '"id":\K([0-9]+)' | tr '\n' ' ')) + for i in $FOLDER_IDS; do + http --ignore-stdin -b -a ${user}:${user} DELETE ${BASE_URLv1}/folders/$i + done +} + +@test "[$TESTSUITE] Read empty" { + run http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/folders + + assert_output --partial "\"folders\":[]" +} + +@test "[$TESTSUITE] Create new" { + run http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/folders name=news-${BATS_SUITE_TEST_NUMBER} + + assert_output --partial "\"name\":\"news-${BATS_SUITE_TEST_NUMBER}\"," +} + +@test "[$TESTSUITE] Delete folder" { + ID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/folders name=news-${BATS_SUITE_TEST_NUMBER} | grep -Po '"id":\K([0-9]+)') + + run http --ignore-stdin -b -a ${user}:${user} DELETE ${BASE_URLv1}/folders/$ID + + assert_output "[]" +} + +@test "[$TESTSUITE] Rename folder" { + ID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/folders name=news-${BATS_SUITE_TEST_NUMBER} | grep -Po '"id":\K([0-9]+)') + + # Rename folder + http --ignore-stdin -b -a ${user}:${user} PUT ${BASE_URLv1}/folders/$ID name=rename-${BATS_SUITE_TEST_NUMBER} + + run http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/folders + + assert_output --partial "\"name\":\"rename-${BATS_SUITE_TEST_NUMBER}\"," +} + +@test "[$TESTSUITE] Mark all items as read" { + # create folder and feed in folder + FOLDER_ID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/folders name=news-${BATS_SUITE_TEST_NUMBER} | grep -Po '"id":\K([0-9]+)') + FEED_ID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/feeds url=$NC_FEED folderId=$FOLDER_ID | grep -Po '"id":\K([0-9]+)') + + ID_LIST=($(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/items id=$FEEDID | grep -Po '"id":\K([0-9]+)' | tr '\n' ' ')) + + # get biggest item ID + max=${ID_LIST[0]} + for n in "${ID_LIST[@]}" ; do + ((n > max)) && max=$n + done + + # mark all items of feed as read, returns nothing + STATUS_CODE=$(http --ignore-stdin -hdo /tmp/body -a ${user}:${user} PUT ${BASE_URLv1}/folders/$FOLDER_ID/read newestItemId="$max" 2>&1| grep HTTP/) + + # collect unread status + unread=$(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/items id=$FEEDID | grep -Po '"unread":\K((true)|(false))' | tr '\n' ' ') + + for n in "${unread[@]}" ; do + if $n + then + echo "Item was not marked as read" + echo $STATUS_CODE + false + fi + done +} + diff --git a/tests/api/helpers/settings.bash b/tests/api/helpers/settings.bash new file mode 100644 index 000000000..3b31fba4c --- /dev/null +++ b/tests/api/helpers/settings.bash @@ -0,0 +1,4 @@ +user=admin +NC_FEED="https://nextcloud.com/blog/static-feed/" +HEISE_FEED="https://www.heise.de/rss/heise-atom.xml" +BASE_URLv1="http://localhost:8080/index.php/apps/news/api/v1-2" \ No newline at end of file diff --git a/tests/api/items.bats b/tests/api/items.bats new file mode 100644 index 000000000..349678966 --- /dev/null +++ b/tests/api/items.bats @@ -0,0 +1,66 @@ +#!/usr/bin/env bats + +setup() { + load "../test_helper/bats-support/load" + load "../test_helper/bats-assert/load" + load "helpers/settings" + + if test -f "tests/api/helpers/settings-override.bash"; then + load "helpers/settings-override" + fi +} + +TESTSUITE="Items" + +teardown() { + # delete all feeds + FEED_IDS=($(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/feeds | grep -Po '"id":\K([0-9]+)' | tr '\n' ' ')) + for i in $FEED_IDS; do + http --ignore-stdin -b -a ${user}:${user} DELETE ${BASE_URLv1}/feeds/$i + done + + # delete all folders + FOLDER_IDS=($(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/folders | grep -Po '"id":\K([0-9]+)' | tr '\n' ' ')) + for i in $FOLDER_IDS; do + http --ignore-stdin -b -a ${user}:${user} DELETE ${BASE_URLv1}/folders/$i + done +} + +@test "[$TESTSUITE] Read empty" { + run http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/items + + assert_output --partial "\"items\":[]" +} + +@test "[$TESTSUITE] Read 5" { + http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/feeds url=$NC_FEED + + ID_LIST=($(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/items batchSize=5 | grep -Po '"id":\K([0-9]+)' | tr '\n' ' ')) + + output=${#ID_LIST[@]} + + assert_output --partial "5" +} + +# TODO GET /items has more options that could be tested. + +@test "[$TESTSUITE] Check updated" { + FEEDID=$(http --ignore-stdin -b -a ${user}:${user} POST ${BASE_URLv1}/feeds url=$NC_FEED | grep -Po '"id":\K([0-9]+)') + ID_LIST=($(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/items id=$FEEDID | grep -Po '"id":\K([0-9]+)' | tr '\n' ' ')) + + # get biggest item ID + max=${ID_LIST[0]} + for n in "${ID_LIST[@]}" ; do + ((n > max)) && max=$n + done + + SYNC_TIME=$(date +%s) + + # mark all items of feed as read, returns nothing (other client marks items as read) + STATUS_CODE=$(http --ignore-stdin -hdo /tmp/body -a ${user}:${user} PUT ${BASE_URLv1}/feeds/$FEEDID/read newestItemId="$max" 2>&1| grep HTTP/) + + # client 2 checks for updates since last sync + UPDATED_ITEMS=($(http --ignore-stdin -b -a ${user}:${user} GET ${BASE_URLv1}/items/updated id=$FEEDID lastModified=$SYNC_TIME | grep -Po '"id":\K([0-9]+)' | tr '\n' ' ')) + + assert_equal ${#ID_LIST[@]} ${#UPDATED_ITEMS[@]} +} \ No newline at end of file diff --git a/tests/command/explore.bats b/tests/command/explore.bats new file mode 100644 index 000000000..7407dc8a8 --- /dev/null +++ b/tests/command/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/command/feeds.bats b/tests/command/feeds.bats new file mode 100644 index 000000000..5ad52dc30 --- /dev/null +++ b/tests/command/feeds.bats @@ -0,0 +1,116 @@ +#!/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] Add feed without GUIDs" { + run ./occ news:feed:add "$user" "$NO_GUID_FEED" + [ "$status" -ne 0 ] + + if ! echo "$output" | grep "No parser can handle this stream"; then + ret_status=$? + echo "Malformed feed exception wasn't properly caught" + 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 + +} + +@test "[$TESTSUITE] Favicon" { + ./occ news:feed:add "$user" "$NC_FEED" --title "Something-${BATS_SUITE_TEST_NUMBER}" + ./occ news:feed:add "$user" "$HEISE_FEED" --title "Something-${BATS_SUITE_TEST_NUMBER}" + + run ./occ news:feed:list "$user" + [ "$status" -eq 0 ] + + if ! echo "$output" | grep -F '"faviconLink": "https:\/\/nextcloud.com\/media\/screenshot-150x150.png"'; then + ret_status=$? + echo "Logo test failed" + return $ret_status + fi + + if ! echo "$output" | grep -F '"faviconLink": "https:\/\/www.heise.de\/favicon.ico"'; then + ret_status=$? + echo "Favicon test failed" + 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] Read 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:read "$user" "$ID" -v + [ "$status" -eq 0 ] + + if ! echo "$output" | grep "items as read"; then + ret_status=$? + echo "Feed not read" + 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 ] +} diff --git a/tests/command/folders.bats b/tests/command/folders.bats new file mode 100644 index 000000000..48b15f05b --- /dev/null +++ b/tests/command/folders.bats @@ -0,0 +1,64 @@ +#!/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] Read all" { + ./occ news:folder:add "$user" "Something-${BATS_SUITE_TEST_NUMBER}" + + ID=$(./occ news:folder:list 'admin' | grep "Something-${BATS_SUITE_TEST_NUMBER}" -1 | head -1 | grep -oE '[0-9]*') + + run ./occ news:folder:read "$user" "$ID" -v + [ "$status" -eq 0 ] + + if ! echo "$output" | grep "items as read"; then + ret_status=$? + echo "Folder not read" + 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 ] +} diff --git a/tests/command/helpers/settings.bash b/tests/command/helpers/settings.bash new file mode 100644 index 000000000..bf58a601a --- /dev/null +++ b/tests/command/helpers/settings.bash @@ -0,0 +1,4 @@ +user=admin +NC_FEED="https://nextcloud.com/blog/static-feed/" +HEISE_FEED="https://www.heise.de/rss/heise-atom.xml" +NO_GUID_FEED="https://raw.githubusercontent.com/nextcloud/news/master/tests/integration/feeds/no_guid_feed.xml" diff --git a/tests/command/items.bats b/tests/command/items.bats new file mode 100644 index 000000000..22a4c73c7 --- /dev/null +++ b/tests/command/items.bats @@ -0,0 +1,84 @@ +#!/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 200 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 feed" { + run ./occ news:item:list-feed "$user" "$ID" --limit 0 + [ "$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 200 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 in folder" { + run ./occ news:item:list-folder "$user" --limit 0 + [ "$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 200 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 +} + +@test "[$TESTSUITE] List all items" { + run ./occ news:item:list "$user" --limit 0 + [ "$status" -eq 0 ] + + if ! echo "$output" | grep "$TAG"; then + ret_status=$? + echo "Release not found in list" + return $ret_status + fi +} diff --git a/tests/command/opml.bats b/tests/command/opml.bats new file mode 100644 index 000000000..b2d576e8e --- /dev/null +++ b/tests/command/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 diff --git a/tests/integration/explore.bats b/tests/integration/explore.bats deleted file mode 100644 index 7407dc8a8..000000000 --- a/tests/integration/explore.bats +++ /dev/null @@ -1,12 +0,0 @@ -#!/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 deleted file mode 100644 index 5ad52dc30..000000000 --- a/tests/integration/feeds.bats +++ /dev/null @@ -1,116 +0,0 @@ -#!/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] Add feed without GUIDs" { - run ./occ news:feed:add "$user" "$NO_GUID_FEED" - [ "$status" -ne 0 ] - - if ! echo "$output" | grep "No parser can handle this stream"; then - ret_status=$? - echo "Malformed feed exception wasn't properly caught" - 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 - -} - -@test "[$TESTSUITE] Favicon" { - ./occ news:feed:add "$user" "$NC_FEED" --title "Something-${BATS_SUITE_TEST_NUMBER}" - ./occ news:feed:add "$user" "$HEISE_FEED" --title "Something-${BATS_SUITE_TEST_NUMBER}" - - run ./occ news:feed:list "$user" - [ "$status" -eq 0 ] - - if ! echo "$output" | grep -F '"faviconLink": "https:\/\/nextcloud.com\/media\/screenshot-150x150.png"'; then - ret_status=$? - echo "Logo test failed" - return $ret_status - fi - - if ! echo "$output" | grep -F '"faviconLink": "https:\/\/www.heise.de\/favicon.ico"'; then - ret_status=$? - echo "Favicon test failed" - 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] Read 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:read "$user" "$ID" -v - [ "$status" -eq 0 ] - - if ! echo "$output" | grep "items as read"; then - ret_status=$? - echo "Feed not read" - 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 ] -} diff --git a/tests/integration/folders.bats b/tests/integration/folders.bats deleted file mode 100644 index 48b15f05b..000000000 --- a/tests/integration/folders.bats +++ /dev/null @@ -1,64 +0,0 @@ -#!/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] Read all" { - ./occ news:folder:add "$user" "Something-${BATS_SUITE_TEST_NUMBER}" - - ID=$(./occ news:folder:list 'admin' | grep "Something-${BATS_SUITE_TEST_NUMBER}" -1 | head -1 | grep -oE '[0-9]*') - - run ./occ news:folder:read "$user" "$ID" -v - [ "$status" -eq 0 ] - - if ! echo "$output" | grep "items as read"; then - ret_status=$? - echo "Folder not read" - 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 ] -} diff --git a/tests/integration/helpers/settings.bash b/tests/integration/helpers/settings.bash deleted file mode 100644 index bf58a601a..000000000 --- a/tests/integration/helpers/settings.bash +++ /dev/null @@ -1,4 +0,0 @@ -user=admin -NC_FEED="https://nextcloud.com/blog/static-feed/" -HEISE_FEED="https://www.heise.de/rss/heise-atom.xml" -NO_GUID_FEED="https://raw.githubusercontent.com/nextcloud/news/master/tests/integration/feeds/no_guid_feed.xml" diff --git a/tests/integration/items.bats b/tests/integration/items.bats deleted file mode 100644 index 22a4c73c7..000000000 --- a/tests/integration/items.bats +++ /dev/null @@ -1,84 +0,0 @@ -#!/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 200 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 feed" { - run ./occ news:item:list-feed "$user" "$ID" --limit 0 - [ "$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 200 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 in folder" { - run ./occ news:item:list-folder "$user" --limit 0 - [ "$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 200 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 -} - -@test "[$TESTSUITE] List all items" { - run ./occ news:item:list "$user" --limit 0 - [ "$status" -eq 0 ] - - if ! echo "$output" | grep "$TAG"; then - ret_status=$? - echo "Release not found in list" - return $ret_status - fi -} diff --git a/tests/integration/opml.bats b/tests/integration/opml.bats deleted file mode 100644 index b2d576e8e..000000000 --- a/tests/integration/opml.bats +++ /dev/null @@ -1,26 +0,0 @@ -#!/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 diff --git a/tests/test_helper/bats-assert b/tests/test_helper/bats-assert new file mode 160000 index 000000000..397c73521 --- /dev/null +++ b/tests/test_helper/bats-assert @@ -0,0 +1 @@ +Subproject commit 397c735212bf1a06cfdd0cb7806c5a6ea79582bf diff --git a/tests/test_helper/bats-support b/tests/test_helper/bats-support new file mode 160000 index 000000000..3c8fadc50 --- /dev/null +++ b/tests/test_helper/bats-support @@ -0,0 +1 @@ +Subproject commit 3c8fadc5097c9acfc96d836dced2bb598e48b009 -- cgit v1.2.3