Repository: CS-SI/eodag
Pull request #1158 (2024-05-24 13:59:50)

Feat: match intersection of the datetime interval on search
The search for the providers `cop_dataspace` and `creodias` matches the product with a datetime range that intersects the given one. The time is sent to the provider with millisecond precision.

github-actions[bot]: ## Test Results
  2 files   -     2    2 suites   - 2   1m 52s :stopwatch: - 3m 21s
533 tests ±    0  516 :white_check_mark:  -    14   3 :zzz: ± 0  14 :x: +14 
828 runs   - 1 304  764 :white_check_mark:  - 1 274  44 :zzz:  - 50  20 :x: +20 

For more details on these failures, see [this check](https://github.com/CS-SI/eodag/runs/25382224002).

Results for commit 381dfec5. ± Comparison against base commit 4040285a.

[test-results]:data:application/gzip;base64,H4sIACWeUGYC/1XMSw7CIBSF4a00jB1wgQJ1M4ZnQmyL4TEy7l2ILY3D892b/418WF1G94ncJpRrKGPYmlQJcW8ToEM7lX6cKT3XI1djOgG/6Bleja4fr8LaI2yISymmRrhJqnuPSiKPcTYFZ0N+STbgSJIz8Fc0cdtCaQNRCdY7My8cG/DUEqFAcy40A6yVXKg3eHbEo88Xa/vLlQgBAAA=

github-actions[bot]: ![badge](https://raw.githubusercontent.com/CS-SI/eodag/_xml_coverage_reports/data/fix-odata-time-interval-search/./badge.svg)


## Code Coverage (Ubuntu)

<details>


```
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                     11       0  100.00%
cli.py                                         303      51  83.17%   60, 646-692, 794-845, 849
config.py                                      343      27  92.13%   81-83, 92, 100, 104-106, 179, 191, 446-448, 512-515, 562-563, 572-573, 652, 721-726, 728
crunch.py                                        6       6  0.00%    18-24
api/__init__.py                                  1       0  100.00%
api/core.py                                    739      76  89.72%   88-97, 371, 598, 642-645, 683, 788, 792-797, 823, 893, 970, 1083, 1173-1185, 1225, 1227, 1231, 1254, 1258-1269, 1282-1288, 1378-1381, 1410-1430, 1487, 1504-1507, 1519-1522, 1890, 1923-1929, 2194, 2198-2201, 2215-2217, 2252
api/search_result.py                            44       6  86.36%   33-35, 70, 79, 86, 100
api/product/__init__.py                          6       0  100.00%
api/product/_assets.py                          44       5  88.64%   27-29, 79, 129
api/product/_product.py                        203      32  84.24%   52-59, 63-65, 169-176, 260-261, 343, 372, 433, 447-450, 463, 487-490, 533-539
api/product/metadata_mapping.py                677      83  87.74%   67-69, 130-132, 233, 265-266, 312-313, 323-335, 337, 348, 354-366, 409-410, 447, 468-471, 494, 502-503, 579-580, 604-605, 611-614, 629-630, 779, 825, 999-1004, 1135, 1149-1169, 1189, 1194, 1304, 1326, 1340, 1353-1372, 1411, 1463, 1501-1505, 1524
api/product/drivers/__init__.py                  6       0  100.00%
api/product/drivers/base.py                      8       2  75.00%   23, 41
plugins/__init__.py                              1       0  100.00%
plugins/base.py                                 23       3  86.96%   25, 48, 55
plugins/manager.py                             132      14  89.39%   49-51, 105-110, 156, 195, 215, 241, 280-281
plugins/apis/__init__.py                         1       0  100.00%
plugins/apis/base.py                             4       0  100.00%
plugins/apis/ecmwf.py                           98      15  84.69%   47-55, 156-158, 205-206, 232-234
plugins/apis/usgs.py                           172      36  79.07%   59-64, 128, 201, 235, 270-272, 277, 303-304, 309, 339-346, 357-362, 384-390, 392-398, 421
plugins/authentication/__init__.py               7       1  85.71%   31
plugins/authentication/aws_auth.py              20       2  90.00%   25-27
plugins/authentication/base.py                  19       3  84.21%   26, 34, 47
plugins/authentication/generic.py               16       3  81.25%   28, 40, 50
plugins/authentication/header.py                17       1  94.12%   27
plugins/authentication/keycloak.py              88      17  80.68%   32-34, 159-160, 190-212, 238-243
plugins/authentication/oauth.py                 15       8  46.67%   25, 32-34, 38-41
plugins/authentication/openid_connect.py       117      11  90.60%   40-42, 153, 159, 172-173, 184-189
plugins/authentication/qsauth.py                36       2  94.44%   32, 83
plugins/authentication/sas_auth.py              49       2  95.92%   32, 76
plugins/authentication/token.py                 90      17  81.11%   35-37, 79, 107, 109, 131-143, 198-201
plugins/authentication/token_exchange.py        35      19  45.71%   74-80, 92-120
plugins/crunch/__init__.py                       1       0  100.00%
plugins/crunch/base.py                          10       2  80.00%   25, 38
plugins/crunch/filter_date.py                   62      15  75.81%   30, 53-58, 72, 81, 90, 93, 105-107, 116-118, 125
plugins/crunch/filter_latest_intersect.py       50      10  80.00%   32-34, 51-52, 71, 80-83, 85, 92-95
plugins/crunch/filter_latest_tpl_name.py        33       2  93.94%   28, 86
plugins/crunch/filter_overlap.py                68      17  75.00%   28-30, 33, 82-85, 91, 99, 110-126
plugins/crunch/filter_property.py               33       8  75.76%   29, 60-65, 68-69, 85-89
plugins/download/__init__.py                     1       0  100.00%
plugins/download/aws.py                        492     165  66.46%   77-83, 272, 285, 352-355, 369-373, 419-421, 425, 459-460, 466-470, 503, 538, 542, 549, 579-587, 591, 629-637, 644-646, 687-761, 779-840, 851-856, 872-885, 914, 929-931, 934, 944-952, 960-973, 983-1002, 1009-1021, 1062, 1088, 1133-1135, 1355
plugins/download/base.py                       260      57  78.08%   58-64, 145, 180, 319-320, 340-346, 377-381, 387-388, 432, 435-449, 461, 465, 538-542, 572-573, 581-598, 605-613, 615-619, 666, 688, 710, 718
plugins/download/creodias_s3.py                 17       9  47.06%   44-58
plugins/download/http.py                       529     132  75.05%   85-91, 124, 203-213, 215-216, 251-254, 318-321, 323-324, 331-336, 354-369, 386-388, 400, 448, 455-461, 479, 493, 507, 515-517, 533-538, 549, 567, 609-613, 635, 675, 720, 734-740, 776-837, 855, 888-897, 923-924, 951-956, 962, 978, 995-996, 1023-1024, 1031, 1093-1099, 1154-1155, 1161, 1171, 1237, 1241, 1255-1271
plugins/download/s3rest.py                     118      27  77.12%   55-58, 121, 162, 197, 227-234, 237-239, 243, 256-262, 270-271, 274-278, 301, 322-325
plugins/search/__init__.py                       1       0  100.00%
plugins/search/base.py                         133      14  89.47%   49-54, 108, 112, 275, 295, 380, 383-391
plugins/search/build_search_result.py          179      24  86.59%   62, 97, 142-143, 149, 160, 296-299, 333, 390-407, 469, 472, 482, 499, 527, 529
plugins/search/creodias_s3.py                   54       3  94.44%   55, 73, 107
plugins/search/csw.py                          107      83  22.43%   43-45, 57-58, 62-63, 74-122, 128-141, 149-181, 199-240
plugins/search/data_request_search.py          197      65  67.01%   52, 89-92, 108, 120, 124-125, 139, 144, 149, 156, 169-172, 226-227, 231, 241-247, 252, 278-281, 289-300, 317, 319, 326-327, 329-330, 348-352, 385, 392, 403, 416, 422-434, 439
plugins/search/qssearch.py                     559      58  89.62%   96, 368-374, 382-383, 490-496, 551-554, 627-628, 669, 688, 703, 756, 777, 780-781, 790, 801, 810, 833, 895-900, 904-905, 933, 1004, 1051, 1127-1131, 1197-1198, 1219, 1244-1256, 1263, 1294-1295, 1306-1312, 1355, 1370, 1390, 1492
plugins/search/static_stac_search.py            47       3  93.62%   39-40, 82
rest/__init__.py                                 5       2  60.00%   21-22
rest/core.py                                   207      17  91.79%   66-72, 261, 345, 605, 607, 610-612, 684, 691-696
rest/server.py                                 299      54  81.94%   80-81, 107, 130-131, 244-246, 262, 302-303, 315-331, 423-428, 460, 627-634, 667, 711-712, 803-805, 822-827, 858, 860, 864-865, 869-870
rest/stac.py                                   464      90  80.60%   64-66, 276, 298, 370, 407-409, 432, 467-468, 554-599, 636-641, 672, 692-693, 886, 951-953, 1172, 1182-1194, 1207-1229, 1243-1288, 1447-1448
rest/types/__init__.py                           1       0  100.00%
rest/types/eodag_search.py                     185       9  95.14%   52-55, 236-240, 293, 296, 364
rest/types/stac_queryables.py                   32       2  93.75%   28, 116
rest/types/stac_search.py                      122      10  91.80%   48-51, 167, 182-184, 192, 196
rest/utils/__init__.py                          96      13  86.46%   51, 108-109, 128-130, 182, 192-206
rest/utils/cql_evaluate.py                      48       5  89.58%   69, 76, 90, 97, 105
rest/utils/rfc3339.py                           31       3  90.32%   78, 90, 92
types/__init__.py                              111      11  90.09%   53, 70, 129-132, 199, 214-218, 245, 258
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                             81       0  100.00%
types/search_args.py                            70      18  74.29%   60-64, 71-88, 104
types/whoosh.py                                 15       0  100.00%
utils/__init__.py                              502      42  91.63%   84, 89, 110-112, 193-194, 203-230, 233, 247, 329-333, 409-413, 434-436, 518, 533, 571-572, 968-971, 979-980, 1021-1022, 1102, 1186, 1204, 1380
utils/constraints.py                           118      38  67.80%   30, 90-99, 140, 145, 149, 160, 186-188, 196, 210-226, 235-246
utils/exceptions.py                             37       2  94.59%   23, 93
utils/import_system.py                          30      20  33.33%   27, 67-81, 93-103
utils/logging.py                                29       1  96.55%   123
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/requests.py                               55      11  80.00%   69, 96, 98, 100, 102, 104, 123, 128-130, 138
utils/rest.py                                   28       1  96.43%   49
utils/stac_reader.py                            91      28  69.23%   55-56, 63-86, 93-95, 99, 141, 155-158
TOTAL                                         9035    1555  82.79%
```

</details>


### Diff against develop

```
Filename                           Stmts    Miss  Cover
-------------------------------  -------  ------  -------
api/product/metadata_mapping.py        0      -1  +0.15%
TOTAL                                  0      -1  +0.01%
```


Results for commit: 6ebbc97c8ce331ccece78fe5e608fd29083e6e75


_Minimum allowed coverage is `70%`_


:recycle: This comment has been updated with latest results


<!-- Sticky Pull Request Commentartifacts/unit-test-results-python3.12-ubuntu-latest/coverage.xml -->
github-actions[bot]: ![badge](https://raw.githubusercontent.com/CS-SI/eodag/_xml_coverage_reports_win/data/fix-odata-time-interval-search/./badge.svg)


## Code Coverage (Windows)

<details>


```
Filename                                     Stmts    Miss  Cover    Missing
-----------------------------------------  -------  ------  -------  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__init__.py                                     11       0  100.00%
cli.py                                         303     203  33.00%   60, 92-98, 111-113, 119, 260-381, 407-471, 487-502, 526-585, 646-692, 794-845, 849
config.py                                      343      57  83.38%   81-83, 92, 100, 104-106, 173, 175, 179, 191, 207, 400, 447-448, 512-515, 560-567, 572-573, 615-622, 634-656, 686, 715-726, 728, 733
crunch.py                                        6       6  0.00%    18-24
api/__init__.py                                  1       0  100.00%
api/core.py                                    739     133  82.00%   88-97, 131-144, 352-356, 371, 598, 642-645, 683, 743-762, 785, 788, 792-797, 823, 893, 917, 970, 1083, 1173-1185, 1225, 1227, 1231, 1254, 1258-1269, 1282-1288, 1378-1381, 1410-1430, 1487, 1504-1507, 1519-1522, 1860-1861, 1890, 1923-1929, 1942-1951, 1996-2014, 2029-2031, 2042-2043, 2054-2063, 2186-2194, 2197-2201, 2215-2217, 2252
api/search_result.py                            44      11  75.00%   33-35, 70, 79, 86, 100, 126, 146, 153, 162, 170
api/product/__init__.py                          6       0  100.00%
api/product/_assets.py                          44       5  88.64%   27-29, 79, 129
api/product/_product.py                        203      32  84.24%   52-59, 63-65, 169-176, 260-261, 343, 372, 433, 447-450, 463, 487-490, 533-539
api/product/metadata_mapping.py                677     134  80.21%   67-69, 130-132, 233, 265-266, 283-284, 312-313, 323-335, 337, 348, 354-366, 372, 378, 407-410, 447, 468-471, 487, 494, 502-507, 544, 579-580, 604-605, 611-614, 629-630, 779, 825, 955-956, 983, 999-1004, 1098, 1130-1169, 1189, 1194, 1202-1213, 1259, 1277, 1304, 1313-1316, 1326, 1340, 1353-1372, 1411, 1438-1463, 1482-1486, 1501-1505, 1523-1534
api/product/drivers/__init__.py                  6       0  100.00%
api/product/drivers/base.py                      8       2  75.00%   23, 41
plugins/__init__.py                              1       0  100.00%
plugins/base.py                                 23       4  82.61%   25, 48, 55, 68
plugins/manager.py                             132      24  81.82%   49-51, 105-110, 124-128, 147-152, 156, 195, 215, 237-244, 280-281
plugins/apis/__init__.py                         1       0  100.00%
plugins/apis/base.py                             4       0  100.00%
plugins/apis/ecmwf.py                           98      70  28.57%   47-55, 89, 103-129, 141-160, 172-249, 264, 276
plugins/apis/usgs.py                           172     116  32.56%   59-64, 102-111, 128, 141, 152-156, 178-213, 228-237, 250-406, 421
plugins/authentication/__init__.py               7       1  85.71%   31
plugins/authentication/aws_auth.py              20       2  90.00%   25-27
plugins/authentication/base.py                  19       4  78.95%   26, 34, 47, 57
plugins/authentication/generic.py               16       3  81.25%   28, 40, 50
plugins/authentication/header.py                17       7  58.82%   27, 65-70, 77, 81-82
plugins/authentication/keycloak.py              88      57  35.23%   32-34, 103-107, 116-119, 126-160, 163-217, 220-244
plugins/authentication/oauth.py                 15       8  46.67%   25, 32-34, 38-41
plugins/authentication/openid_connect.py       117      21  82.05%   40-42, 153, 159, 172-173, 184-189, 354-371
plugins/authentication/qsauth.py                36      21  41.67%   32, 65-87, 94, 98-104
plugins/authentication/sas_auth.py              49      32  34.69%   32, 48-52, 58-84, 93, 97-108
plugins/authentication/token.py                 90      17  81.11%   35-37, 79, 107, 109, 131-143, 198-201
plugins/authentication/token_exchange.py        35      19  45.71%   74-80, 92-120
plugins/crunch/__init__.py                       1       0  100.00%
plugins/crunch/base.py                          10       2  80.00%   25, 38
plugins/crunch/filter_date.py                   62      15  75.81%   30, 53-58, 72, 81, 90, 93, 105-107, 116-118, 125
plugins/crunch/filter_latest_intersect.py       50      35  30.00%   32-34, 48-53, 69-114
plugins/crunch/filter_latest_tpl_name.py        33       2  93.94%   28, 86
plugins/crunch/filter_overlap.py                68      17  75.00%   28-30, 33, 82-85, 91, 99, 110-126
plugins/crunch/filter_property.py               33       8  75.76%   29, 60-65, 68-69, 85-89
plugins/download/__init__.py                     1       0  100.00%
plugins/download/aws.py                        492     420  14.63%   77-83, 269-393, 415-429, 439-470, 492-520, 537-592, 617-640, 644-646, 687-761, 779-840, 851-856, 872-885, 904-934, 944-952, 959-975, 983-1002, 1009-1021, 1035-1051, 1055-1075, 1079-1135, 1145-1340, 1355
plugins/download/base.py                       260     114  56.15%   58-64, 145, 180, 211-214, 235, 250-252, 319-320, 340-346, 377-381, 387-388, 432, 435-449, 461, 465, 515-623, 666, 673-693, 706-710, 716-725
plugins/download/creodias_s3.py                 17      10  41.18%   34, 44-58
plugins/download/http.py                       529     147  72.21%   85-91, 124, 203-213, 215-216, 251-254, 318-321, 323-324, 331-336, 354-369, 386-388, 400, 448, 455-461, 479, 493, 507, 515-517, 533-538, 549, 567, 609-613, 635, 675, 706, 720, 734-740, 776-837, 844-855, 867-897, 923-924, 951-956, 962, 977-982, 995-996, 1023-1024, 1031, 1093-1099, 1154-1155, 1161, 1171, 1237, 1241, 1255-1271, 1354
plugins/download/s3rest.py                     118      98  16.95%   55-58, 88-89, 120-342
plugins/search/__init__.py                       1       0  100.00%
plugins/search/base.py                         133      21  84.21%   49-54, 108, 112, 140-146, 275, 295, 380, 383-391, 393
plugins/search/build_search_result.py          179     125  30.17%   62, 97, 121, 135-237, 296-299, 313, 325-327, 333, 340-351, 371-374, 387-454, 467-553
plugins/search/creodias_s3.py                   54      34  37.04%   50-55, 59-110, 126-136
plugins/search/csw.py                          107      83  22.43%   43-45, 57-58, 62-63, 74-122, 128-141, 149-181, 199-240
plugins/search/data_request_search.py          197     170  13.71%   52, 68-112, 120, 124-125, 138-255, 262-286, 289-300, 303-333, 338-352, 362-409, 412-417, 422-434, 438-441
plugins/search/qssearch.py                     559     170  69.59%   96, 360-501, 513-526, 551-554, 627-628, 669, 688, 703, 744-781, 790, 801, 810, 821-822, 824, 833, 841, 895-900, 904-905, 933, 961, 998, 1004, 1036-1063, 1069, 1092-1097, 1127-1131, 1142, 1170-1205, 1219, 1244-1256, 1263, 1294-1295, 1306-1312, 1355, 1368, 1370, 1380, 1390, 1397, 1400, 1402, 1452-1521
plugins/search/static_stac_search.py            47       3  93.62%   39-40, 82
rest/__init__.py                                 5       2  60.00%   21-22
rest/core.py                                   207      96  53.62%   66-72, 153, 155, 157, 163-164, 185-193, 199-205, 252-306, 319-355, 505-536, 554, 604-643, 684, 691-696
rest/server.py                                 299     299  0.00%    18-883
rest/stac.py                                   464     153  67.03%   64-66, 218, 276, 298, 370, 407-409, 432, 467-468, 554-599, 636-641, 672, 680-681, 685-693, 758-761, 828, 886, 951-953, 970-972, 980-982, 995-997, 1011-1028, 1038-1059, 1069-1091, 1099-1116, 1139-1162, 1172, 1182-1194, 1207-1229, 1243-1288, 1441-1467
rest/types/__init__.py                           1       0  100.00%
rest/types/eodag_search.py                     185      18  90.27%   52-55, 236-240, 273-275, 293, 296, 302, 306, 364, 376-379
rest/types/stac_queryables.py                   32       6  81.25%   28, 55-60, 116
rest/types/stac_search.py                      122      50  59.02%   48-51, 127, 129, 131, 139, 166-172, 179-198, 204-229, 240, 243, 253-261
rest/utils/__init__.py                          96      37  61.46%   51, 79-85, 97-99, 104-109, 128-130, 143, 150, 175-183, 190-211
rest/utils/cql_evaluate.py                      48      27  43.75%   36, 41, 46, 51, 68-105, 110-114, 119
rest/utils/rfc3339.py                           31      22  29.03%   43-50, 72-94
types/__init__.py                              111      85  23.42%   52-57, 66-70, 81-93, 109-132, 158-177, 198-270
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                             81       2  97.53%   46-51
types/search_args.py                            70      33  52.86%   60-64, 71-88, 103-134
types/whoosh.py                                 15       0  100.00%
utils/__init__.py                              502      50  90.04%   84, 89, 110-112, 193-194, 203-230, 233, 247, 329-333, 371, 409-413, 434-436, 518, 533, 571-572, 907, 968-971, 979-980, 1021-1022, 1075-1076, 1102, 1131, 1145, 1163, 1185-1186, 1204, 1380
utils/constraints.py                           118     103  12.71%   30, 55-164, 179-199, 208-227, 235-246
utils/exceptions.py                             37       2  94.59%   23, 93
utils/import_system.py                          30      20  33.33%   27, 67-81, 93-103
utils/logging.py                                29      12  58.62%   43, 58-123, 152, 154-158
utils/notebook.py                               44      23  47.73%   25-29, 36-41, 58-62, 72-78, 83-87
utils/requests.py                               55      11  80.00%   69, 96, 98, 100, 102, 104, 123, 128-130, 138
utils/rest.py                                   28      20  28.57%   38-57, 63-74
utils/stac_reader.py                            91      31  65.93%   55-59, 63-86, 93-95, 99, 141, 155-158
TOTAL                                         9035    3584  60.33%
```

</details>


### Diff against develop

```
Filename                                    Stmts    Miss  Cover
----------------------------------------  -------  ------  -------
cli.py                                          0    +152  -50.17%
config.py                                       0     +29  -8.46%
api/core.py                                     0     +57  -7.72%
api/search_result.py                            0      +5  -11.36%
api/product/metadata_mapping.py                 0     +49  -7.23%
plugins/manager.py                              0     +10  -7.57%
plugins/apis/ecmwf.py                           0     +55  -56.12%
plugins/apis/usgs.py                            0     +80  -46.51%
plugins/authentication/base.py                  0      +1  -5.26%
plugins/authentication/header.py                0      +6  -35.30%
plugins/authentication/keycloak.py              0     +40  -45.45%
plugins/authentication/openid_connect.py        0     +10  -8.55%
plugins/authentication/qsauth.py                0     +19  -52.77%
plugins/authentication/sas_auth.py              0     +30  -61.23%
plugins/download/aws.py                         0    +255  -51.83%
plugins/download/base.py                        0     +55  -21.16%
plugins/download/creodias_s3.py                 0      +1  -5.88%
plugins/download/http.py                        0     +15  -2.84%
plugins/download/s3rest.py                      0     +71  -60.17%
plugins/search/base.py                          0      +6  -4.51%
plugins/search/build_search_result.py           0     +94  -52.51%
plugins/search/creodias_s3.py                   0     +31  -57.40%
plugins/search/data_request_search.py           0    +105  -53.30%
plugins/search/qssearch.py                      0     +88  -15.74%
rest/stac.py                                    0      +4  -0.86%
rest/types/stac_search.py                       0     +38  -31.14%
rest/utils/__init__.py                          0      +6  -6.25%
rest/utils/cql_evaluate.py                      0     +22  -45.83%
rest/utils/rfc3339.py                           0     +17  -54.84%
types/__init__.py                               0     +49  -44.15%
types/queryables.py                             0      +2  -2.47%
types/search_args.py                            0     +15  -21.43%
utils/__init__.py                               0      +7  -1.39%
utils/constraints.py                            0     +65  -55.09%
utils/logging.py                                0     +11  -37.93%
utils/rest.py                                   0     +19  -67.86%
utils/stac_reader.py                            0      +3  -3.30%
TOTAL                                           0   +1522  -16.85%
```


Results for commit: 6ebbc97c8ce331ccece78fe5e608fd29083e6e75


_Minimum allowed coverage is `70%`_


:recycle: This comment has been updated with latest results


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

Patch:
diff --git a/eodag/resources/providers.yml b/eodag/resources/providers.yml
index 04a2352a..df81f8b6 100644
--- a/eodag/resources/providers.yml
+++ b/eodag/resources/providers.yml
@@ -933,8 +933,8 @@
             - "Attributes/OData.CSC.StringAttribute/any(att:att/Name eq 'operationalMode' and att/OData.CSC.StringAttribute/Value eq '{sensorMode}')"
             - "Attributes/OData.CSC.StringAttribute/any(att:att/Name eq 'polarisationChannels' and att/OData.CSC.StringAttribute/Value eq '{polarizationChannels}')"
             - "Attributes/OData.CSC.StringAttribute/any(att:att/Name eq 'tileId' and att/OData.CSC.StringAttribute/Value eq '{tileIdentifier}')"
-            - 'ContentDate/Start gt {startTimeFromAscendingNode#to_iso_utc_datetime}'
-            - 'ContentDate/End lt {completionTimeFromAscendingNode#to_iso_utc_datetime}'
+            - "ContentDate/Start lt {completionTimeFromAscendingNode#to_iso_utc_datetime}"
+            - "ContentDate/End gt {startTimeFromAscendingNode#to_iso_utc_datetime}"
             - contains(Name,'{id}')
     discover_metadata:
       auto_discovery: true
@@ -1018,7 +1018,7 @@
       # The geographic extent of the product
       geometry:
         - null
-        - '{$.Footprint.`sub(/.*(SRID=[0-9]+;[A-Z0-9 \(\),.-]+).*/, \\1)`#from_ewkt}'
+        - '{$.Footprint.`sub(/.*(SRID=[0-9]+;[A-Z0-9 \(\),\.-]+).*/, \\1)`#from_ewkt}'
       # The url to download the product "as is" (literal or as a template to be completed either after the search result
       # is obtained from the provider or during the eodag download phase)
       downloadLink: 'https://zipper.creodias.eu/odata/v1/Products({uid})/$value'
@@ -3882,8 +3882,8 @@
             - "Attributes/OData.CSC.StringAttribute/any(att:att/Name eq 'operationalMode' and att/OData.CSC.StringAttribute/Value eq '{sensorMode}')"
             - "Attributes/OData.CSC.StringAttribute/any(att:att/Name eq 'polarisationChannels' and att/OData.CSC.StringAttribute/Value eq '{polarizationChannels}')"
             - "Attributes/OData.CSC.StringAttribute/any(att:att/Name eq 'tileId' and att/OData.CSC.StringAttribute/Value eq '{tileIdentifier}')"
-            - 'ContentDate/Start gt {startTimeFromAscendingNode#to_iso_utc_datetime}'
-            - 'ContentDate/End lt {completionTimeFromAscendingNode#to_iso_utc_datetime}'
+            - "ContentDate/Start lt {completionTimeFromAscendingNode#to_iso_utc_datetime}"
+            - "ContentDate/End gt {startTimeFromAscendingNode#to_iso_utc_datetime}"
             - contains(Name,'{id}')
     discover_metadata:
       auto_discovery: true
@@ -3965,7 +3965,7 @@
       # The geographic extent of the product
       geometry:
         - null
-        - '{$.Footprint.`sub(/.*(SRID=[0-9]+;[A-Z0-9 \(\),.-]+).*/, \\1)`#from_ewkt}'
+        - '{$.Footprint.`sub(/.*(SRID=[0-9]+;[A-Z0-9 \(\),\.-]+).*/, \\1)`#from_ewkt}'
       # The url to download the product "as is" (literal or as a template to be completed either after the search result
       # is obtained from the provider or during the eodag download phase)
       downloadLink: 'https://catalogue.dataspace.copernicus.eu/odata/v1/Products({uid})/$value'
@@ -6118,8 +6118,8 @@
             - "Attributes/OData.CSC.StringAttribute/any(att:att/Name eq 'operationalMode' and att/OData.CSC.StringAttribute/Value eq '{sensorMode}')"
             - "Attributes/OData.CSC.StringAttribute/any(att:att/Name eq 'polarisationChannels' and att/OData.CSC.StringAttribute/Value eq '{polarizationChannels}')"
             - "Attributes/OData.CSC.StringAttribute/any(att:att/Name eq 'tileId' and att/OData.CSC.StringAttribute/Value eq '{tileIdentifier}')"
-            - 'ContentDate/Start gt {startTimeFromAscendingNode#to_iso_utc_datetime}'
-            - 'ContentDate/End lt {completionTimeFromAscendingNode#to_iso_utc_datetime}'
+            - "ContentDate/Start lt {completionTimeFromAscendingNode#to_iso_utc_datetime}"
+            - "ContentDate/End gt {startTimeFromAscendingNode#to_iso_utc_datetime}"
             - contains(Name,'{id}')
     discover_metadata:
       auto_discovery: true
@@ -6203,7 +6203,7 @@
       # The geographic extent of the product
       geometry:
         - null
-        - '{$.Footprint.`sub(/.*(SRID=[0-9]+;[A-Z0-9 \(\),.-]+).*/, \\1)`#from_ewkt}'
+        - '{$.Footprint.`sub(/.*(SRID=[0-9]+;[A-Z0-9 \(\),\.-]+).*/, \\1)`#from_ewkt}'
       # The url to download the product "as is" (literal or as a template to be completed either after the search result
       # is obtained from the provider or during the eodag download phase)
       downloadLink: 'https://zipper.creodias.eu/odata/v1/Products({uid})/$value'
diff --git a/eodag/rest/types/stac_search.py b/eodag/rest/types/stac_search.py
index b5c078e4..955f3a29 100644
--- a/eodag/rest/types/stac_search.py
+++ b/eodag/rest/types/stac_search.py
@@ -143,13 +143,13 @@ class SearchPostRequest(BaseModel):
     def start_date(self) -> Optional[str]:
         """Extract the start date from the datetime string."""
         start = str_to_interval(self.datetime)[0]
-        return start.strftime("%Y-%m-%dT%H:%M:%SZ") if start else None
+        return start.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z" if start else None
 
     @property
     def end_date(self) -> Optional[str]:
         """Extract the end date from the datetime string."""
         end = str_to_interval(self.datetime)[1]
-        return end.strftime("%Y-%m-%dT%H:%M:%SZ") if end else None
+        return end.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z" if end else None
 
     @field_validator("ids", "collections", mode="before")
     @classmethod


Test patch:
diff --git a/tests/units/test_core.py b/tests/units/test_core.py
index 416e91de..284e4325 100644
--- a/tests/units/test_core.py
+++ b/tests/units/test_core.py
@@ -610,11 +610,15 @@ class TestCore(TestCoreBase):
                 self.assertListProductTypesRightStructure(product_type)
                 if product_type["ID"] in self.SUPPORTED_PRODUCT_TYPES:
                     self.assertIn(
-                        provider, self.SUPPORTED_PRODUCT_TYPES[product_type["ID"]]
+                        provider,
+                        self.SUPPORTED_PRODUCT_TYPES[product_type["ID"]],
+                        f"missing in supported providers for {product_type['ID']}",
                     )
                 else:
                     self.assertIn(
-                        provider, self.SUPPORTED_PRODUCT_TYPES[product_type["_id"]]
+                        provider,
+                        self.SUPPORTED_PRODUCT_TYPES[product_type["_id"]],
+                        f"missing in supported providers for {product_type['_id']}",
                     )
 
     def test_list_product_types_for_unsupported_provider(self):
diff --git a/tests/units/test_http_server.py b/tests/units/test_http_server.py
index 1bf024c5..92664e98 100644
--- a/tests/units/test_http_server.py
+++ b/tests/units/test_http_server.py
@@ -608,8 +608,8 @@ class RequestTestCase(unittest.TestCase):
                 productType=self.tested_product_type,
                 page=1,
                 items_per_page=DEFAULT_ITEMS_PER_PAGE,
-                start="2018-01-20T00:00:00Z",
-                end="2018-01-25T00:00:00Z",
+                start="2018-01-20T00:00:00.000Z",
+                end="2018-01-25T00:00:00.000Z",
                 geom=box(0, 43, 1, 44, ccw=False),
                 raise_errors=False,
             ),
@@ -620,7 +620,7 @@ class RequestTestCase(unittest.TestCase):
                 productType=self.tested_product_type,
                 page=1,
                 items_per_page=DEFAULT_ITEMS_PER_PAGE,
-                start="2018-01-20T00:00:00Z",
+                start="2018-01-20T00:00:00.000Z",
                 geom=box(0, 43, 1, 44, ccw=False),
                 raise_errors=False,
             ),
@@ -631,7 +631,7 @@ class RequestTestCase(unittest.TestCase):
                 productType=self.tested_product_type,
                 page=1,
                 items_per_page=DEFAULT_ITEMS_PER_PAGE,
-                end="2018-01-25T00:00:00Z",
+                end="2018-01-25T00:00:00.000Z",
                 geom=box(0, 43, 1, 44, ccw=False),
                 raise_errors=False,
             ),
@@ -642,8 +642,8 @@ class RequestTestCase(unittest.TestCase):
                 productType=self.tested_product_type,
                 page=1,
                 items_per_page=DEFAULT_ITEMS_PER_PAGE,
-                start="2018-01-20T00:00:00Z",
-                end="2018-01-20T00:00:00Z",
+                start="2018-01-20T00:00:00.000Z",
+                end="2018-01-20T00:00:00.000Z",
                 geom=box(0, 43, 1, 44, ccw=False),
                 raise_errors=False,
             ),
@@ -667,8 +667,8 @@ class RequestTestCase(unittest.TestCase):
                 productType=self.tested_product_type,
                 page=1,
                 items_per_page=DEFAULT_ITEMS_PER_PAGE,
-                start="2018-01-20T00:00:00Z",
-                end="2018-01-25T00:00:00Z",
+                start="2018-01-20T00:00:00.000Z",
+                end="2018-01-25T00:00:00.000Z",
                 geom=box(0, 43, 1, 44, ccw=False),
                 raise_errors=False,
             ),
@@ -910,8 +910,8 @@ class RequestTestCase(unittest.TestCase):
                 productType=self.tested_product_type,
                 page=1,
                 items_per_page=DEFAULT_ITEMS_PER_PAGE,
-                start="2018-01-20T00:00:00Z",
-                end="2018-01-25T00:00:00Z",
+                start="2018-01-20T00:00:00.000Z",
+                end="2018-01-25T00:00:00.000Z",
                 raise_errors=False,
             ),
         )
@@ -926,7 +926,7 @@ class RequestTestCase(unittest.TestCase):
                 productType=self.tested_product_type,
                 page=1,
                 items_per_page=DEFAULT_ITEMS_PER_PAGE,
-                start="2018-01-20T00:00:00Z",
+                start="2018-01-20T00:00:00.000Z",
                 raise_errors=False,
             ),
         )
@@ -941,7 +941,7 @@ class RequestTestCase(unittest.TestCase):
                 productType=self.tested_product_type,
                 page=1,
                 items_per_page=DEFAULT_ITEMS_PER_PAGE,
-                end="2018-01-25T00:00:00Z",
+                end="2018-01-25T00:00:00.000Z",
                 raise_errors=False,
             ),
         )
@@ -956,8 +956,8 @@ class RequestTestCase(unittest.TestCase):
                 productType=self.tested_product_type,
                 page=1,
                 items_per_page=DEFAULT_ITEMS_PER_PAGE,
-                start="2018-01-20T00:00:00Z",
-                end="2018-01-20T00:00:00Z",
+                start="2018-01-20T00:00:00.000Z",
+                end="2018-01-20T00:00:00.000Z",
                 raise_errors=False,
             ),
         )