From 8258758ba7fe00168a04853d44c38953ad8283cb Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 14 Nov 2024 22:56:45 +0100 Subject: [PATCH] tests(Integration): add ods test and consolidate scenarios in an outline Signed-off-by: Arthur Schiwon --- tests/integration/features/APIv1.feature | 63 +++--------------- .../resources/import-from-libreoffice.csv | 3 + .../resources/import-from-libreoffice.ods | Bin 0 -> 14457 bytes 3 files changed, 12 insertions(+), 54 deletions(-) create mode 100644 tests/integration/resources/import-from-libreoffice.csv create mode 100644 tests/integration/resources/import-from-libreoffice.ods diff --git a/tests/integration/features/APIv1.feature b/tests/integration/features/APIv1.feature index 77c45be4b..23b6ee828 100644 --- a/tests/integration/features/APIv1.feature +++ b/tests/integration/features/APIv1.feature @@ -187,39 +187,11 @@ Feature: APIv1 Then user deletes last created row Then user "participant1" deletes table with keyword "Rows check" - - @api1 @import - Scenario: Import csv table - Given file "/import.csv" exists for user "participant1" with following data - | Col1 | Col2 | Col3 | num | emoji | special | date | truth | - | Val1 | Val2 | Val3 | 1 | 💙 | Ä | 2024-02-24 | false | - | great | news | here | 99 | ⚠️ | Ö | 2016-06-01 | true | - Given table "Import test" with emoji "👨🏻‍💻" exists for user "participant1" as "base1" - When user imports file "/import.csv" into last created table - Then import results have the following data - | found_columns_count | 8 | - | created_columns_count | 8 | - | inserted_rows_count | 2 | - | errors_count | 0 | - Then table has at least following typed columns - | Col1 | text | - | Col2 | text | - | Col3 | text | - | num | number | - | emoji | text | - | special | text | - | date | datetime | - | truth | selection | - Then table contains at least following rows - | Col1 | Col2 | Col3 | num | emoji | special | date | truth | - | Val1 | Val2 | Val3 | 1 | 💙 | Ä | 2024-02-24 | false | - | great | news | here | 99 | ⚠️ | Ö | 2016-06-01 | true | - @api1 @import - Scenario: Import xlsx table generated by 365 - Given user "participant1" uploads file "import-from-ms365.xlsx" + Scenario Outline: Import a document file + Given user "participant1" uploads file "" And table "Import test" with emoji "👨🏻‍💻" exists for user "participant1" as "base1" - When user imports file "/import-from-ms365.xlsx" into last created table + When user imports file "/" into last created table Then import results have the following data | found_columns_count | 8 | | created_columns_count | 8 | @@ -239,29 +211,12 @@ Feature: APIv1 | Val1 | Val2 | Val3 | 1 | 💙 | Ä | 2024-02-24 | false | | great | news | here | 99 | ⚠ | Ö | 2016-06-01 | true | - @api1 @import - Scenario: Import xlsx table generated by LibreOffice - Given user "participant1" uploads file "import-from-libreoffice.xlsx" - And table "Import test" with emoji "👨🏻‍💻" exists for user "participant1" as "base1" - When user imports file "/import-from-libreoffice.xlsx" into last created table - Then import results have the following data - | found_columns_count | 8 | - | created_columns_count | 8 | - | inserted_rows_count | 2 | - | errors_count | 0 | - Then table has at least following typed columns - | Col1 | text | - | Col2 | text | - | Col3 | text | - | num | number | - | emoji | text | - | special | text | - | date | datetime | - | truth | selection | - Then table contains at least following rows - | Col1 | Col2 | Col3 | num | emoji | special | date | truth | - | Val1 | Val2 | Val3 | 1 | 💙 | Ä | 2024-02-24 | false | - | great | news | here | 99 | ⚠ | Ö | 2016-06-01 | true | + Examples: + | importfile | + | import-from-libreoffice.ods | + | import-from-libreoffice.xlsx | + | import-from-ms365.xlsx | + | import-from-libreoffice.csv | @api1 Scenario: Create, edit and delete views diff --git a/tests/integration/resources/import-from-libreoffice.csv b/tests/integration/resources/import-from-libreoffice.csv new file mode 100644 index 000000000..d27e813d1 --- /dev/null +++ b/tests/integration/resources/import-from-libreoffice.csv @@ -0,0 +1,3 @@ +Col1,Col2,Col3,num,emoji,special,date,truth +Val1,Val2,Val3,1,💙,Ä,2024-02-24,false +great,news,here,99,⚠,Ö,2016-06-01,true diff --git a/tests/integration/resources/import-from-libreoffice.ods b/tests/integration/resources/import-from-libreoffice.ods new file mode 100644 index 0000000000000000000000000000000000000000..5d539f6e6f511248bee5a88bb135735b173a5016 GIT binary patch literal 14457 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