Repository: CS-SI/eodag
Pull request #1666 (2025-05-22 07:34:58)

fix(core): Queryables mismatch when list of possible values contains a single value
This pull request fixes an issue where queryables were not matching correctly.
When the list of possible values contained only a single value, the dedl provider was returning an empty list instead of the expected single-item list.

github-actions[bot]: ## Test Results
    4 files  ±0      4 suites  ±0   5m 45s ⏱️ -19s
  629 tests ±0    626 ✅ ±0    3 💤 ±0  0 ❌ ±0 
2 516 runs  ±0  2 414 ✅ ±0  102 💤 ±0  0 ❌ ±0 

Results for commit ecfe2662. ± Comparison against base commit c2762815.

[test-results]:data:application/gzip;base64,H4sIAFrULmgC/03MTQ7CIBCG4as0rF3AFIbgZQwgJMT+GAqrxrsLtWCX7zOZbyc+TG4j94HfBrLlkHo8c9QprEvJkYsC5ZTqEUG1emzZ2oPwT6/wrj8dvA5TAdrBxbjGU2Je6iYIhme1TeCMd/ptMgpNLqNHXzftOs8hlSDOegeI4DUVAiygVcpolMJ4aUZJZWk0oMjnC6wKlX4JAQAA

eodag-bot: ![badge](https://raw.githubusercontent.com/CS-SI/eodag/_xml_coverage_reports/data/queryables_type/./badge.svg)


## Code Coverage (Ubuntu)

<details>


```
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                      8       0  100.00%
cli.py                                         323      64  80.19%   62-63, 87, 674-737, 839-890, 894
config.py                                      433      27  93.76%   80-82, 91, 99, 103-105, 176, 187, 701-703, 817-820, 863-864, 873-874, 979, 1038-1043, 1045
crunch.py                                        5       5  0.00%    20-24
api/__init__.py                                  0       0  100.00%
api/core.py                                    784      73  90.69%   316-317, 367, 657, 701-704, 742, 786, 820, 865-870, 896, 987, 1055, 1278-1290, 1326, 1328, 1356, 1360-1371, 1384-1390, 1473-1476, 1509-1529, 1598-1603, 1615-1618, 1954, 1978-1984, 2235, 2239-2243, 2252-2254, 2298-2299, 2328-2329
api/search_result.py                            56       4  92.86%   80, 89, 96, 110
api/product/__init__.py                          6       0  100.00%
api/product/_assets.py                          52       5  90.38%   97, 183, 191, 194-198
api/product/_product.py                        201      19  90.55%   70-72, 236-237, 312, 339, 440, 458, 482-485, 494-497, 552-555
api/product/metadata_mapping.py                703      63  91.04%   121-123, 221, 253-254, 311-323, 325, 336, 361, 401-402, 439, 460-463, 486, 494-495, 588-589, 613-614, 620-623, 638-639, 788, 839, 992, 1001-1005, 1022-1027, 1154, 1168-1188, 1208, 1213, 1346, 1360, 1385, 1431, 1483, 1506-1507, 1527-1531, 1547, 1555
api/product/drivers/__init__.py                 20       2  90.00%   33-36
api/product/drivers/base.py                     29       1  96.55%   98
api/product/drivers/generic.py                   7       0  100.00%
api/product/drivers/sentinel1.py                15       0  100.00%
api/product/drivers/sentinel2.py                15       0  100.00%
plugins/__init__.py                              0       0  100.00%
plugins/base.py                                 21       2  90.48%   48, 55
plugins/manager.py                             173      16  90.75%   105-110, 154, 192, 214, 218, 242, 281-282, 382-385, 397-398
plugins/apis/__init__.py                         0       0  100.00%
plugins/apis/base.py                             4       0  100.00%
plugins/apis/ecmwf.py                           97      10  89.69%   167-169, 216-217, 243-245, 298-299
plugins/apis/usgs.py                           180      26  85.56%   156, 258, 292, 327-329, 334, 360-361, 366, 396-403, 414-419, 441-447, 478
plugins/authentication/__init__.py               6       1  83.33%   31
plugins/authentication/aws_auth.py              20       0  100.00%
plugins/authentication/base.py                  17       2  88.24%   45, 58
plugins/authentication/generic.py               14       2  85.71%   51, 61
plugins/authentication/header.py                19       0  100.00%
plugins/authentication/keycloak.py              46       7  84.78%   151-154, 175-180
plugins/authentication/oauth.py                 13       7  46.15%   43-45, 49-52
plugins/authentication/openid_connect.py       208      28  86.54%   80-81, 93-111, 149, 155-183, 191, 323-326, 352, 386
plugins/authentication/qsauth.py                34       1  97.06%   91
plugins/authentication/sas_auth.py              47       1  97.87%   76
plugins/authentication/token.py                127       9  92.91%   168, 205, 277-278, 328-332
plugins/authentication/token_exchange.py        36      14  61.11%   75, 92-120
plugins/crunch/__init__.py                       0       0  100.00%
plugins/crunch/base.py                          10       1  90.00%   43
plugins/crunch/filter_date.py                   59      14  76.27%   52-57, 69, 78, 87, 90, 102-104, 113-115, 122
plugins/crunch/filter_latest_intersect.py       47       8  82.98%   52-53, 69, 78-81, 83, 90-93
plugins/crunch/filter_latest_tpl_name.py        31       1  96.77%   83
plugins/crunch/filter_overlap.py                66      18  72.73%   28-30, 66-69, 76-79, 85, 93, 104-120
plugins/crunch/filter_property.py               30       5  83.33%   55-60, 63-64
plugins/download/__init__.py                     0       0  100.00%
plugins/download/aws.py                        528     158  70.08%   272, 285, 365-368, 382-386, 476-478, 482, 515-516, 522-526, 556, 589, 593, 600, 630-638, 642, 677-685, 696-698, 729-810, 828-886, 897-902, 955, 970-972, 975, 985-993, 1001-1015, 1025-1048, 1055-1068, 1106, 1132, 1177-1179, 1399
plugins/download/base.py                       253      42  83.40%   127, 155, 235-238, 291-292, 340-344, 350-351, 393, 396-410, 422, 426, 490-494, 524-525, 550-558, 560-564, 607, 629, 651, 659
plugins/download/creodias_s3.py                 25       9  64.00%   55-69
plugins/download/http.py                       541      93  82.81%   227, 269-272, 333-336, 339, 346-351, 382-384, 401, 416, 470, 505, 519, 533, 541-543, 559-564, 575, 593, 629-632, 653, 663, 667, 687, 764, 783-794, 802-807, 817-834, 852, 882-891, 927, 952-953, 972-977, 986, 1001-1003, 1007, 1010, 1025-1026, 1061, 1123, 1138, 1197-1198, 1204, 1214, 1250, 1286, 1306, 1341-1343
plugins/download/s3rest.py                     116      24  79.31%   119, 153, 160, 195, 222-229, 232-234, 238, 249-255, 263-264, 267-271, 294, 315-318
plugins/search/__init__.py                      22       0  100.00%
plugins/search/base.py                         151      11  92.72%   101, 105, 129-135, 276, 296, 435
plugins/search/build_search_result.py          477      56  88.26%   245-246, 282, 285, 310, 313, 344-346, 555, 557, 561, 564, 691, 693, 754, 761, 785, 820, 871, 920-935, 980, 1005, 1008, 1012, 1132-1133, 1142-1151, 1214, 1235, 1254-1263, 1380-1381, 1426, 1435-1437, 1497, 1543
plugins/search/cop_marine.py                   252      47  81.35%   56, 64-66, 76-77, 82, 87-88, 104, 106, 109, 175-176, 232, 238, 242, 246, 259, 270-271, 279, 310, 314, 335, 339, 343, 347, 351-355, 361-364, 367-381, 398, 447-451, 456, 468
plugins/search/creodias_s3.py                   25       1  96.00%   51
plugins/search/csw.py                          105      81  22.86%   98-99, 103-104, 112-160, 166-179, 187-219, 237-278
plugins/search/data_request_search.py          202      69  65.84%   189-192, 208, 219, 223-224, 235, 240, 245, 252, 265-268, 322-323, 327, 337-343, 348, 374-377, 385-396, 413, 415, 422-425, 427-428, 446-450, 483, 493, 504, 517, 523-538, 543
plugins/search/qssearch.py                     711      86  87.90%   454, 512, 526, 530-536, 564-568, 681-693, 738-741, 812-813, 861, 880, 887, 899, 956, 977, 980-981, 990-991, 1000-1001, 1010-1011, 1038, 1122-1127, 1131-1140, 1174, 1196, 1269-1270, 1276, 1366, 1527, 1530, 1536-1537, 1558, 1586-1598, 1605, 1637-1639, 1649-1655, 1685, 1708, 1713-1714, 1729, 1745, 1829, 1836, 1847, 1870-1875, 1884, 1893
plugins/search/stac_list_assets.py              25      10  60.00%   44-51, 75-85
plugins/search/static_stac_search.py            79      13  83.54%   100-126, 170, 183
rest/__init__.py                                 4       2  50.00%   21-22
rest/cache.py                                   33       7  78.79%   35-37, 53-55, 59, 68
rest/config.py                                  25       0  100.00%
rest/constants.py                                6       0  100.00%
rest/core.py                                   260      62  76.15%   258, 301, 316-352, 446, 483-522, 599, 629-632, 705, 712-765
rest/errors.py                                  69       5  92.75%   112, 122, 133, 158-159
rest/server.py                                 192      24  87.50%   86, 109-111, 285-290, 318, 514-516, 533-538, 567, 569, 573-574, 578-579
rest/stac.py                                   319      63  80.25%   309, 331, 383-386, 413-440, 471-473, 496, 528-529, 611-651, 673-689, 781-785, 792, 846-847, 908, 998-1000
rest/types/__init__.py                           0       0  100.00%
rest/types/collections_search.py                13      13  0.00%    18-44
rest/types/eodag_search.py                     180       5  97.22%   225-229, 282, 285, 353
rest/types/queryables.py                        64      12  81.25%   61, 71-79, 105-110, 174
rest/types/stac_search.py                      125       7  94.40%   128, 174, 189-191, 199, 203
rest/utils/__init__.py                          94      12  87.23%   101-102, 121-123, 175, 185-199
rest/utils/cql_evaluate.py                      48       5  89.58%   69, 76, 90, 97, 105
rest/utils/rfc3339.py                           23       3  86.96%   48, 60, 62
types/__init__.py                              169      54  68.05%   68, 81-85, 96-108, 136-138, 145-150, 168-176, 228-229, 235-236, 238-239, 277, 287-303, 308, 310, 332, 337, 345, 355
types/bbox.py                                   43      19  55.81%   46-61, 72-74, 85-87, 99-101, 113-115, 123
types/download_args.py                           9       0  100.00%
types/queryables.py                            110       0  100.00%
types/search_args.py                            70      18  74.29%   60-64, 71-88, 103
types/whoosh.py                                 81      16  80.25%   129-132, 136-143, 155-161, 174-176
utils/__init__.py                              548      40  92.70%   81, 198-199, 208-235, 238, 253, 333-337, 410-414, 433-435, 449, 541, 556, 596-597, 626, 1001-1004, 1012-1013, 1051-1052, 1099-1100, 1240
utils/exceptions.py                             46       0  100.00%
utils/import_system.py                          28      19  32.14%   64-78, 89-99
utils/logging.py                                28       1  96.43%   41
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/repr.py                                   38       8  78.95%   51, 53, 57, 98, 122-129
utils/requests.py                               55      29  47.27%   51-52, 64, 85-96, 107-124, 128
utils/rest.py                                   36       1  97.22%   55
utils/s3.py                                     69       3  95.65%   162-163, 226
utils/stac_reader.py                           113      44  61.06%   63-85, 95-97, 101, 138, 154-159, 206-216, 226-256
TOTAL                                        10416    1631  84.34%
```

</details>


### Diff against develop

```
Filename                      Stmts    Miss  Cover
--------------------------  -------  ------  -------
plugins/search/qssearch.py       +3       0  +0.05%
types/__init__.py               +21     +14  -4.92%
TOTAL                           +24     +14  -0.10%
```


Results for commit: ecfe2662fa0552c26c99ba675bf7b3707c996b29


_Minimum allowed coverage is `70%`_


:recycle: This comment has been updated with latest results


<!-- Sticky Pull Request Commentartifacts/unit-test-results-python3.13-ubuntu-latest/coverage.xml -->
eodag-bot: ![badge](https://raw.githubusercontent.com/CS-SI/eodag/_xml_coverage_reports_win/data/queryables_type/./badge.svg)


## Code Coverage (Windows)

<details>


```
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                      8       0  100.00%
cli.py                                         323      64  80.19%   62-63, 87, 674-737, 839-890, 894
config.py                                      433      28  93.53%   80-82, 91, 99, 103-105, 176, 187, 701-703, 817-820, 863-864, 873-874, 979, 1008, 1038-1043, 1045
crunch.py                                        5       5  0.00%    20-24
api/__init__.py                                  0       0  100.00%
api/core.py                                    784      73  90.69%   316-317, 367, 657, 701-704, 742, 786, 820, 865-870, 896, 987, 1055, 1278-1290, 1326, 1328, 1356, 1360-1371, 1384-1390, 1473-1476, 1509-1529, 1598-1603, 1615-1618, 1954, 1978-1984, 2235, 2239-2243, 2252-2254, 2298-2299, 2328-2329
api/search_result.py                            56       4  92.86%   80, 89, 96, 110
api/product/__init__.py                          6       0  100.00%
api/product/_assets.py                          52       5  90.38%   97, 183, 191, 194-198
api/product/_product.py                        201      19  90.55%   70-72, 236-237, 312, 339, 440, 458, 482-485, 494-497, 552-555
api/product/metadata_mapping.py                703      63  91.04%   121-123, 221, 253-254, 311-323, 325, 336, 361, 401-402, 439, 460-463, 486, 494-495, 588-589, 613-614, 620-623, 638-639, 788, 839, 992, 1001-1005, 1022-1027, 1154, 1168-1188, 1208, 1213, 1346, 1360, 1385, 1431, 1483, 1506-1507, 1527-1531, 1547, 1555
api/product/drivers/__init__.py                 20       2  90.00%   33-36
api/product/drivers/base.py                     29       1  96.55%   98
api/product/drivers/generic.py                   7       0  100.00%
api/product/drivers/sentinel1.py                15       0  100.00%
api/product/drivers/sentinel2.py                15       0  100.00%
plugins/__init__.py                              0       0  100.00%
plugins/base.py                                 21       3  85.71%   48, 55, 68
plugins/manager.py                             173      16  90.75%   105-110, 154, 192, 214, 218, 242, 281-282, 382-385, 397-398
plugins/apis/__init__.py                         0       0  100.00%
plugins/apis/base.py                             4       0  100.00%
plugins/apis/ecmwf.py                           97      10  89.69%   167-169, 216-217, 243-245, 298-299
plugins/apis/usgs.py                           180      26  85.56%   156, 258, 292, 327-329, 334, 360-361, 366, 396-403, 414-419, 441-447, 478
plugins/authentication/__init__.py               6       1  83.33%   31
plugins/authentication/aws_auth.py              20       0  100.00%
plugins/authentication/base.py                  17       2  88.24%   45, 58
plugins/authentication/generic.py               14       2  85.71%   51, 61
plugins/authentication/header.py                19       0  100.00%
plugins/authentication/keycloak.py              46       7  84.78%   151-154, 175-180
plugins/authentication/oauth.py                 13       7  46.15%   43-45, 49-52
plugins/authentication/openid_connect.py       208      28  86.54%   80-81, 93-111, 149, 155-183, 191, 323-326, 352, 386
plugins/authentication/qsauth.py                34       1  97.06%   91
plugins/authentication/sas_auth.py              47       1  97.87%   76
plugins/authentication/token.py                127       9  92.91%   168, 205, 277-278, 328-332
plugins/authentication/token_exchange.py        36      14  61.11%   75, 92-120
plugins/crunch/__init__.py                       0       0  100.00%
plugins/crunch/base.py                          10       1  90.00%   43
plugins/crunch/filter_date.py                   59      14  76.27%   52-57, 69, 78, 87, 90, 102-104, 113-115, 122
plugins/crunch/filter_latest_intersect.py       47      33  29.79%   49-54, 67-112
plugins/crunch/filter_latest_tpl_name.py        31       1  96.77%   83
plugins/crunch/filter_overlap.py                66      18  72.73%   28-30, 66-69, 76-79, 85, 93, 104-120
plugins/crunch/filter_property.py               30       5  83.33%   55-60, 63-64
plugins/download/__init__.py                     0       0  100.00%
plugins/download/aws.py                        528     158  70.08%   272, 285, 365-368, 382-386, 476-478, 482, 515-516, 522-526, 556, 589, 593, 600, 630-638, 642, 677-685, 696-698, 729-810, 828-886, 897-902, 955, 970-972, 975, 985-993, 1001-1015, 1025-1048, 1055-1068, 1106, 1132, 1177-1179, 1399
plugins/download/base.py                       253      44  82.61%   127, 155, 222-224, 235-238, 291-292, 340-344, 350-351, 393, 396-410, 422, 426, 490-494, 524-525, 550-558, 560-564, 607, 629, 651, 659
plugins/download/creodias_s3.py                 25       9  64.00%   55-69
plugins/download/http.py                       541      93  82.81%   227, 269-272, 333-336, 339, 346-351, 382-384, 401, 416, 470, 505, 519, 533, 541-543, 559-564, 575, 593, 629-632, 653, 663, 667, 687, 764, 783-794, 802-807, 817-834, 852, 882-891, 927, 952-953, 972-977, 986, 1001-1003, 1007, 1010, 1025-1026, 1061, 1123, 1138, 1197-1198, 1204, 1214, 1250, 1286, 1306, 1341-1343
plugins/download/s3rest.py                     116      24  79.31%   119, 153, 160, 195, 222-229, 232-234, 238, 249-255, 263-264, 267-271, 294, 315-318
plugins/search/__init__.py                      22       0  100.00%
plugins/search/base.py                         151      11  92.72%   101, 105, 129-135, 276, 296, 435
plugins/search/build_search_result.py          477      63  86.79%   245-246, 282, 285, 310, 313, 344-346, 553-564, 691, 693, 754, 761, 785, 820, 871, 886, 920-935, 980, 1005, 1008, 1012, 1132-1133, 1142-1151, 1214, 1229, 1235, 1254-1263, 1380-1381, 1426, 1435-1437, 1497, 1543
plugins/search/cop_marine.py                   252      47  81.35%   56, 64-66, 76-77, 82, 87-88, 104, 106, 109, 175-176, 232, 238, 242, 246, 259, 270-271, 279, 310, 314, 335, 339, 343, 347, 351-355, 361-364, 367-381, 398, 447-451, 456, 468
plugins/search/creodias_s3.py                   25       1  96.00%   51
plugins/search/csw.py                          105      81  22.86%   98-99, 103-104, 112-160, 166-179, 187-219, 237-278
plugins/search/data_request_search.py          202      69  65.84%   189-192, 208, 219, 223-224, 235, 240, 245, 252, 265-268, 322-323, 327, 337-343, 348, 374-377, 385-396, 413, 415, 422-425, 427-428, 446-450, 483, 493, 504, 517, 523-538, 543
plugins/search/qssearch.py                     711      99  86.08%   454, 512, 526, 530-536, 564-568, 681-693, 738-741, 812-813, 861, 880, 887, 899, 956, 977, 980-981, 990-991, 1000-1001, 1010-1011, 1038, 1122-1127, 1131-1140, 1174, 1196, 1269-1270, 1276, 1366, 1463-1467, 1527, 1530, 1536-1537, 1558, 1586-1598, 1605, 1637-1639, 1649-1655, 1685, 1708, 1713-1714, 1729, 1745, 1817, 1829, 1836, 1847, 1870-1875, 1884, 1892-1902, 1920, 1931, 1944-1948
plugins/search/stac_list_assets.py              25      10  60.00%   44-51, 75-85
plugins/search/static_stac_search.py            79      13  83.54%   100-126, 170, 183
rest/__init__.py                                 4       2  50.00%   21-22
rest/cache.py                                   33      22  33.33%   35-37, 44-70
rest/config.py                                  25       1  96.00%   35
rest/constants.py                                6       0  100.00%
rest/core.py                                   260     153  41.15%   157, 159, 161, 164-165, 179-189, 198-199, 205, 208, 249-303, 316-352, 383-420, 435-451, 467-476, 483-522, 539, 581-666, 705, 712-765
rest/errors.py                                  69      49  28.99%   62, 67-106, 111-114, 121-124, 132-162, 170-175, 190-196
rest/server.py                                 192     192  0.00%    18-592
rest/stac.py                                   319      68  78.68%   243, 309, 331, 383-386, 413-440, 471-473, 496, 528-529, 611-651, 673-689, 716, 781-785, 792, 846-847, 853, 908, 946, 979, 998-1000
rest/types/__init__.py                           0       0  100.00%
rest/types/collections_search.py                13      13  0.00%    18-44
rest/types/eodag_search.py                     180      20  88.89%   225-229, 262-264, 282, 285, 291, 295, 353, 371-386
rest/types/queryables.py                        64      20  68.75%   54-55, 60-63, 68-79, 105-110, 119-120, 174
rest/types/stac_search.py                      125      11  91.20%   126-128, 174, 189-191, 199, 203, 251, 254
rest/utils/__init__.py                          94      30  68.09%   72-78, 98, 101-102, 121-123, 136, 143, 168-176, 183-204
rest/utils/cql_evaluate.py                      48       5  89.58%   69, 76, 90, 97, 105
rest/utils/rfc3339.py                           23       5  78.26%   43-44, 48, 60, 62
types/__init__.py                              169      56  66.86%   68, 72, 81-85, 96-108, 136-138, 145-150, 168-176, 228-229, 235-236, 238-239, 242, 277, 287-303, 308, 310, 332, 337, 345, 355
types/bbox.py                                   43      19  55.81%   46-61, 72-74, 85-87, 99-101, 113-115, 123
types/download_args.py                           9       0  100.00%
types/queryables.py                            110       0  100.00%
types/search_args.py                            70      18  74.29%   60-64, 71-88, 103
types/whoosh.py                                 81      16  80.25%   129-132, 136-143, 155-161, 174-176
utils/__init__.py                              548      40  92.70%   81, 198-199, 208-235, 238, 253, 333-337, 410-414, 433-435, 449, 541, 556, 596-597, 626, 1001-1004, 1012-1013, 1051-1052, 1099-1100, 1240
utils/exceptions.py                             46       0  100.00%
utils/import_system.py                          28      19  32.14%   64-78, 89-99
utils/logging.py                                28       1  96.43%   41
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/repr.py                                   38       8  78.95%   51, 53, 57, 98, 122-129
utils/requests.py                               55      29  47.27%   51-52, 64, 85-96, 107-124, 128
utils/rest.py                                   36       1  97.22%   55
utils/s3.py                                     69       3  95.65%   162-163, 226
utils/stac_reader.py                           113      44  61.06%   63-85, 95-97, 101, 138, 154-159, 206-216, 226-256
TOTAL                                        10416    2053  80.29%
```

</details>


### Diff against develop

```
Filename                      Stmts    Miss  Cover
--------------------------  -------  ------  -------
plugins/search/qssearch.py       +3       0  +0.06%
types/__init__.py               +21     +14  -4.76%
TOTAL                           +24     +14  -0.09%
```


Results for commit: ecfe2662fa0552c26c99ba675bf7b3707c996b29


_Minimum allowed coverage is `70%`_


:recycle: This comment has been updated with latest results


<!-- Sticky Pull Request Commentartifacts/unit-test-results-python3.13-windows-latest/coverage.xml -->

Patch:
diff --git a/eodag/plugins/authentication/generic.py b/eodag/plugins/authentication/generic.py
index 8df68b1f..fc81dddb 100644
--- a/eodag/plugins/authentication/generic.py
+++ b/eodag/plugins/authentication/generic.py
@@ -46,7 +46,11 @@ class GenericAuth(Authentication):
         """Authenticate"""
         self.validate_config_credentials()
         method = getattr(self.config, "method", "basic")
-
+        if not all(x in self.config.credentials for x in ["username", "password"]):
+            raise MisconfiguredError(
+                f"Missing credentials for provider {self.provider}",
+                "You must provide 'username' and 'password' in the configuration.",
+            )
         if method == "digest":
             return HTTPDigestAuth(
                 self.config.credentials["username"],
diff --git a/eodag/plugins/search/qssearch.py b/eodag/plugins/search/qssearch.py
index 7abe73f8..49750f0b 100644
--- a/eodag/plugins/search/qssearch.py
+++ b/eodag/plugins/search/qssearch.py
@@ -1920,10 +1920,9 @@ class StacSearch(PostJsonSearch):
             python_queryables = create_model("m", **field_definitions).model_fields
             geom_queryable = python_queryables.pop("geometry", None)
             if geom_queryable:
-                python_queryables["geom"] = geom_queryable
+                python_queryables["geom"] = Queryables.model_fields["geom"]
 
             queryables_dict = model_fields_to_annotated(python_queryables)
-
             # append "datetime" as "start" & "end" if needed
             if "datetime" in json_queryables:
                 eodag_queryables = copy_deepcopy(
diff --git a/eodag/types/__init__.py b/eodag/types/__init__.py
index a3fde0d0..f6fd8a25 100644
--- a/eodag/types/__init__.py
+++ b/eodag/types/__init__.py
@@ -183,6 +183,8 @@ def json_field_definition_to_python(
     )
 
     enum = json_field_definition.get("enum")
+    const = json_field_definition.get("const")
+    anyOf = json_field_definition.get("anyOf")
 
     if python_type in (list, set):
         items = json_field_definition.get("items")
@@ -194,11 +196,19 @@ def json_field_definition_to_python(
                 )
             ]
         elif isinstance(items, dict):
-            enum = items.get("enum")
+            if "enum" in items:
+                enum = items.get("enum")
+            elif "const" in items:
+                const = items.get("const")
 
     if enum:
         literal = Literal[tuple(sorted(enum))]  # type: ignore
         python_type = list[literal] if python_type in (list, set) else literal  # type: ignore
+    elif const:
+        literal = Literal[const]
+        python_type = list[literal] if python_type in (list, set) else literal  # type: ignore
+    elif anyOf:
+        python_type = str
 
     if "$ref" in json_field_definition:
         field_type_kwargs["json_schema_extra"] = {"$ref": json_field_definition["$ref"]}
diff --git a/eodag/types/queryables.py b/eodag/types/queryables.py
index c388ae49..abf2ca2d 100644
--- a/eodag/types/queryables.py
+++ b/eodag/types/queryables.py
@@ -18,14 +18,14 @@
 from __future__ import annotations
 
 from collections import UserDict
-from datetime import date, datetime
 from typing import Annotated, Any, Optional, Union
 
 from annotated_types import Lt
-from pydantic import BaseModel, Field
+from pydantic import BaseModel, ConfigDict, Field
 from pydantic.fields import FieldInfo
 from pydantic.types import PositiveInt
 from pydantic_core import PydanticUndefined
+from shapely.geometry.base import BaseGeometry
 
 from eodag.types import annotated_dict_to_model, model_fields_to_annotated
 from eodag.utils.repr import remove_class_repr, shorter_type_repr
@@ -72,12 +72,28 @@ class Queryables(CommonQueryables):
     """
 
     start: Annotated[
-        Union[datetime, date], Field(None, alias="startTimeFromAscendingNode")
+        str,
+        Field(
+            None,
+            alias="startTimeFromAscendingNode",
+            description="Date/time as string in ISO 8601 format (e.g. '2024-06-10T12:00:00Z')",
+        ),
     ]
     end: Annotated[
-        Union[datetime, date], Field(None, alias="completionTimeFromAscendingNode")
+        str,
+        Field(
+            None,
+            alias="completionTimeFromAscendingNode",
+            description="Date/time as string in ISO 8601 format (e.g. '2024-06-10T12:00:00Z')",
+        ),
+    ]
+    geom: Annotated[
+        Union[str, dict[str, float], BaseGeometry],
+        Field(
+            None,
+            description="Read EODAG documentation for all supported geometry format.",
+        ),
     ]
-    geom: Annotated[str, Field(None, alias="geometry")]
     uid: Annotated[str, Field(None)]
     # OpenSearch Parameters for Collection Search (Table 3)
     doi: Annotated[str, Field(None)]
@@ -150,6 +166,8 @@ class Queryables(CommonQueryables):
     id: Annotated[str, Field(None)]
     tileIdentifier: Annotated[str, Field(None, pattern=r"[0-9]{2}[A-Z]{3}")]
 
+    model_config = ConfigDict(arbitrary_types_allowed=True)
+
 
 class QueryablesDict(UserDict[str, Any]):
     """Class inheriting from UserDict which contains queryables with their annotated type;


Test patch:
diff --git a/tests/units/test_search_plugins.py b/tests/units/test_search_plugins.py
index 99cf224a..ea73ecc8 100644
--- a/tests/units/test_search_plugins.py
+++ b/tests/units/test_search_plugins.py
@@ -23,6 +23,7 @@ import ssl
 import unittest
 from datetime import datetime, timedelta, timezone
 from pathlib import Path
+from typing import Literal, Union, get_origin
 from unittest import mock
 from unittest.mock import call
 
@@ -35,6 +36,7 @@ import yaml
 from botocore.stub import Stubber
 from pydantic_core import PydanticUndefined
 from requests import RequestException
+from shapely.geometry.base import BaseGeometry
 from typing_extensions import get_args
 
 from eodag.api.product import AssetsDict
@@ -1803,6 +1805,133 @@ class TestSearchPluginStacSearch(BaseSearchPluginTest):
         self.assertIn("start", queryables)
         self.assertIn("end", queryables)
 
+    @mock.patch(
+        "eodag.plugins.search.qssearch.QueryStringSearch._request", autospec=True
+    )
+    def test_plugins_search_dedl_discover_queryables(self, mock_request):
+        """
+        Test the discovery and parsing of queryables from the DEDL provider.
+
+        This test verifies that:
+        - The "ecmwf:time" field is correctly interpreted as an annotated list with a
+        single literal value "00:00".
+        - The "start" field is interpreted as an annotated union of datetime and date types.
+        - The "geom" field is interpreted as an annotated union that includes a string,
+        a dictionary with string keys and float values, and subclasses of BaseGeometry.
+
+        The test mocks the _request method of the plugin to simulate a response with
+        predefined queryables, then verifies the correctness of the resulting type annotations.
+        """
+        provider_queryables = {
+            "$schema": "https://json-schema.org/draft/2019-09/schema",
+            "type": "object",
+            "title": "Queryables for EODAG STAC API",
+            "description": "Queryable names for the EODAG STAC API Item Search filter. ",
+            "properties": {
+                "ecmwf:variable": {
+                    "default": "10m_u_component_of_wind",
+                    "items": {
+                        "enum": [
+                            "10m_u_component_of_wind",
+                            "10m_v_component_of_wind",
+                            "2m_dewpoint_temperature",
+                            "2m_temperature",
+                        ],
+                        "type": "string",
+                    },
+                    "title": "variable",
+                    "type": "array",
+                },
+                "ecmwf:pressure_level": {
+                    "items": {},
+                    "title": "pressure_level",
+                    "type": "array",
+                },
+                "ecmwf:time": {
+                    "default": "00:00",
+                    "description": "Model base time as HH:MM (UTC)",
+                    "items": {"const": "00:00", "type": "string"},
+                    "title": "time",
+                    "type": "array",
+                },
+                "start_datetime": {
+                    "anyOf": [
+                        {"format": "date-time", "type": "string"},
+                        {"format": "date", "type": "string"},
+                    ],
+                    "default": "2015-01-01T00:00:00Z",
+                    "title": "start_datetime",
+                },
+                "end_datetime": {
+                    "anyOf": [
+                        {"format": "date-time", "type": "string"},
+                        {"format": "date", "type": "string"},
+                    ],
+                    "default": "2015-01-01T00:00:00Z",
+                    "title": "end_datetime",
+                },
+                "geometry": {
+                    "description": "Geometry",
+                    "ref": "https://schemas.stacspec.org/v1.0.0/item-spec/json-schema/item.json#/geometry",
+                },
+                "bbox": {
+                    "description": "BBox",
+                    "type": "array",
+                    "oneOf": [
+                        {"minItems": 4, "maxItems": 4},
+                        {"minItems": 6, "maxItems": 6},
+                    ],
+                    "items": {"type": "number"},
+                },
+            },
+            "required": [
+                "ecmwf:variable",
+                "ecmwf:time",
+                "start_datetime",
+                "geometry",
+                "bbox",
+            ],
+            "additionalProperties": False,
+        }
+        mock_request.return_value = mock.Mock()
+        mock_request.return_value.json.side_effect = [provider_queryables]
+        plugin = self.get_search_plugin(provider="dedl")
+        queryables_dedl = plugin.discover_queryables(
+            productType="CAMS_GAC_FORECAST", provider="dedl"
+        )
+
+        # Check that "ecmwf:time" has type Annotated[list[Literal['00:00']], ...]
+        self.assertIn("ecmwf:time", queryables_dedl)
+        annotated_type = queryables_dedl["ecmwf:time"]
+        args = get_args(annotated_type)
+        base_type = args[0]
+        self.assertEqual(get_origin(base_type), list)
+        literal_args = get_args(base_type)
+        self.assertEqual(literal_args, (Literal["00:00"],))
+
+        # Check that "start" has type Annotated[str, ...]
+        self.assertIn("start", queryables_dedl)
+        annotated_type = queryables_dedl["start"]
+        args = get_args(annotated_type)
+        self.assertEqual(args[0], str)
+
+        # Check that "geom" has type Annotated[Union[str, dict[str, float], BaseGeometry], ...]
+        self.assertIn("geom", queryables_dedl)
+        annotated_type = queryables_dedl["geom"]
+        args = get_args(annotated_type)
+        base_type = args[0]
+        self.assertEqual(get_origin(base_type), Union)
+        union_args = get_args(base_type)
+        self.assertIn(str, union_args)
+        self.assertTrue(any(get_origin(arg) is dict for arg in union_args))
+        self.assertTrue(
+            any(
+                issubclass(arg, BaseGeometry)
+                for arg in union_args
+                if isinstance(arg, type)
+            )
+        )
+
 
 class TestSearchPluginMeteoblueSearch(BaseSearchPluginTest):
     @mock.patch("eodag.plugins.authentication.qsauth.requests.get", autospec=True)