[Git][debian-gis-team/asf-search][master] 4 commits: New upstream version 12.0.7

Antonio Valentino (@antonio.valentino) gitlab at salsa.debian.org
Tue Apr 14 07:01:14 BST 2026



Antonio Valentino pushed to branch master at Debian GIS Project / asf-search


Commits:
5d64dd8e by Antonio Valentino at 2026-04-14T05:54:02+00:00
New upstream version 12.0.7
- - - - -
ca8039a8 by Antonio Valentino at 2026-04-14T05:54:05+00:00
Update upstream source from tag 'upstream/12.0.7'

Update to upstream version '12.0.7'
with Debian dir f8cca2b937e0a1a49dfa5134df3be1f8c2b0da5c
- - - - -
f08a9153 by Antonio Valentino at 2026-04-14T05:54:40+00:00
New upstream release

- - - - -
51cb2698 by Antonio Valentino at 2026-04-14T05:55:20+00:00
Set distribution to unstable

- - - - -


10 changed files:

- CHANGELOG.md
- asf_search/CMR/translate.py
- asf_search/search/search.py
- asf_search/search/search_count.py
- asf_search/search/search_generator.py
- debian/changelog
- tests/Search/test_search.py
- tests/pytest-config.yml
- tests/pytest-managers.py
- tests/yml_tests/test_search.yml


Changes:

=====================================
CHANGELOG.md
=====================================
@@ -25,6 +25,12 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 -
 
 -->
+------
+## [v12.0.7](https://github.com/asfadmin/Discovery-asf_search/compare/v12.0.6...v12.0.7)
+### Added
+- `granule_list` supports wildcard ("*" and "?") searches
+    - For more information: https://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#parameter-options
+
 ------
 ## [v12.0.6](https://github.com/asfadmin/Discovery-asf_search/compare/v12.0.5...v12.0.6)
 ### Added


=====================================
asf_search/CMR/translate.py
=====================================
@@ -17,6 +17,8 @@ except ImportError:
     from dateutil.parser import parse as parse_datetime
 
 nisar_collections_set = set(collections_per_platform['NISAR'])
+
+
 def translate_opts(opts: ASFSearchOptions) -> List:
     # Need to add params which ASFSearchOptions cant support (like temporal),
     # so use a dict to avoid the validate_params logic:
@@ -24,7 +26,9 @@ def translate_opts(opts: ASFSearchOptions) -> List:
 
     should_use_track = not set(dict_opts.get('collections', [])).isdisjoint(nisar_collections_set)
 
-    if dict_opts.get('processingLevel') is not None: # Certain products are now using PRODUCT_TYPE instead of PROCESSING_LEVEL
+    if (
+        dict_opts.get('processingLevel') is not None
+    ):  # Certain products are now using PRODUCT_TYPE instead of PROCESSING_LEVEL
         processingType = dict_opts.get('processingLevel', [])[0]
         if processingType in NISAR_PRODUCT_TYPES:
             should_use_track = True
@@ -85,18 +89,21 @@ def translate_opts(opts: ASFSearchOptions) -> List:
     # user provided umm fields
     custom_cmr_keywords = dict_opts.pop('cmr_keywords', [])
 
+    granule_list_with_wildcard = False
     for key, val in dict_opts.items():
         # If it's "session" or something else CMR doesn't accept, don't send it:
         if key not in field_map:
             if key == 'productType':
                 custom_cmr_keywords.append(('attribute[]', f'string,PRODUCT_TYPE,{val}'))
-            
+
             continue
         if isinstance(val, list):
             for x in val:
                 if key in ['granule_list', 'product_list']:
                     for y in x.split(','):
                         cmr_opts.append((key, y))
+                        if key == 'granule_list' and ('*' in y or '?' in y):
+                            granule_list_with_wildcard = True
                 else:
                     if isinstance(x, tuple):
                         cmr_opts.append((key, ','.join([str(t) for t in x])))
@@ -110,10 +117,10 @@ def translate_opts(opts: ASFSearchOptions) -> List:
 
     if should_use_asf_frame(cmr_opts):
         cmr_opts = use_asf_frame(cmr_opts)
-    
+
     if should_use_track:
         cmr_opts = use_track_number(cmr_opts)
-        
+
     cmr_opts.extend(custom_cmr_keywords)
 
     additional_keys = [
@@ -125,6 +132,9 @@ def translate_opts(opts: ASFSearchOptions) -> List:
         ('provider', opts.provider),
     ]
 
+    if granule_list_with_wildcard:
+        additional_keys.append(('options[readable_granule_name][pattern]', 'true'))
+
     cmr_opts.extend(additional_keys)
 
     return cmr_opts
@@ -140,7 +150,15 @@ def fix_cmr_shapes(fixed_params: Dict[str, Any]) -> Dict[str, Any]:
 
 
 def should_use_asf_frame(cmr_opts):
-    asf_frame_platforms = ['SENTINEL-1A', 'SENTINEL-1B', 'SENTINEL-1C', 'ALOS', 'ALOS-2', 'NISAR', 'SEASAT 1']
+    asf_frame_platforms = [
+        'SENTINEL-1A',
+        'SENTINEL-1B',
+        'SENTINEL-1C',
+        'ALOS',
+        'ALOS-2',
+        'NISAR',
+        'SEASAT 1',
+    ]
 
     asf_frame_collections = get_concept_id_alias(asf_frame_platforms, collections_per_platform)
 
@@ -178,6 +196,7 @@ def use_asf_frame(cmr_opts):
 
     return cmr_opts
 
+
 def use_track_number(cmr_opts):
     """
     NISAR: always use track number instead of path number
@@ -191,12 +210,15 @@ def use_track_number(cmr_opts):
         if m is None:
             continue
 
-        logging.debug('NISAR subquery with relativeOrbit, using TRACK_NUMBER instead of PATH_NUMBER')
+        logging.debug(
+            'NISAR subquery with relativeOrbit, using TRACK_NUMBER instead of PATH_NUMBER'
+        )
 
         cmr_opts[n] = (p[0], p[1].replace(',PATH_NUMBER,', ',TRACK_NUMBER,'))
 
     return cmr_opts
 
+
 # some products don't have integer values in BYTES fields, round to nearest int
 def try_round_float(value: str) -> Optional[int]:
     if value is None:
@@ -219,13 +241,15 @@ def try_parse_float(value: str) -> Optional[float]:
 
     return float(value)
 
+
 def try_parse_bool(val: str) -> Optional[bool]:
     """Boolean values are stored as strings in umm json"""
     if val is None:
         return None
-    
+
     return val.lower() == 'true'
 
+
 def try_parse_frame_coverage(val: str) -> Optional[str]:
     """Frame Coverage is stored as a string boolean in FULL_FRAME, convert it to Partial/Full"""
     if val is not None:
@@ -233,9 +257,10 @@ def try_parse_frame_coverage(val: str) -> Optional[str]:
             val = 'Full'
         else:
             val = 'Partial'
-    
+
     return val
 
+
 def try_parse_date(value: str) -> Optional[str]:
     if value is None:
         return None


=====================================
asf_search/search/search.py
=====================================
@@ -57,7 +57,7 @@ def search(
     sideBandPolarization: Union[str, Sequence[str]] = None,
     rangeBandwidth: Union[str, Sequence[str]] = None,
     jointObservation: bool = None,
-    productionConfiguration: Union[Literal["PR", "UR"], Sequence[Literal["PR", "UR"]]] = None,
+    productionConfiguration: Union[Literal['PR', 'UR'], Sequence[Literal['PR', 'UR']]] = None,
     dataset: Union[str, Sequence[str]] = None,
     collections: Union[str, Sequence[str]] = None,
     shortName: Union[str, Sequence[str]] = None,
@@ -118,6 +118,7 @@ def search(
     granule_list:
         List of specific granules.
         Search results may include several products per granule name.
+        Supports wildcard queries (*/?)
     groupID:
         Identifier used to find products considered to
         be of the same scene but having different granule names
@@ -191,7 +192,6 @@ def search(
         results.searchOptions = page.searchOptions
         perf = time.time()
 
-
     if not results.searchComplete:
         msg = (
             'Results may be incomplete due to a search error. '
@@ -199,7 +199,6 @@ def search(
         )
 
         ASF_LOGGER.error(msg)
-        
 
     try:
         results.sort(key=lambda p: p.get_sort_keys(), reverse=True)


=====================================
asf_search/search/search_count.py
=====================================
@@ -51,11 +51,11 @@ def search_count(
     fullBurstID: Union[str, Sequence[str]] = None,
     temporalBaselineDays: Union[str, Sequence[str]] = None,
     operaBurstID: Union[str, Sequence[str]] = None,
-    frameCoverage: Literal["FULL", "PARTIAL"] = None,
+    frameCoverage: Literal['FULL', 'PARTIAL'] = None,
     mainBandPolarization: Union[str, Sequence[str]] = None,
     sideBandPolarization: Union[str, Sequence[str]] = None,
     rangeBandwidth: Union[str, Sequence[str]] = None,
-    productionConfiguration: Union[Literal["PR", "UR"], Sequence[Literal["PR", "UR"]]] = None,
+    productionConfiguration: Union[Literal['PR', 'UR'], Sequence[Literal['PR', 'UR']]] = None,
     jointObservation: bool = None,
     dataset: Union[str, Sequence[str]] = None,
     collections: Union[str, Sequence[str]] = None,


=====================================
asf_search/search/search_generator.py
=====================================
@@ -77,12 +77,12 @@ def search_generator(
     fullBurstID: Union[str, Sequence[str]] = None,
     temporalBaselineDays: Union[str, Sequence[str]] = None,
     operaBurstID: Union[str, Sequence[str]] = None,
-    frameCoverage: Literal["FULL", "PARTIAL"] = None,
+    frameCoverage: Literal['FULL', 'PARTIAL'] = None,
     mainBandPolarization: Union[str, Sequence[str]] = None,
     sideBandPolarization: Union[str, Sequence[str]] = None,
     rangeBandwidth: Union[str, Sequence[str]] = None,
     jointObservation: bool = None,
-    productionConfiguration: Union[Literal["PR", "UR"], Sequence[Literal["PR", "UR"]]] = None,
+    productionConfiguration: Union[Literal['PR', 'UR'], Sequence[Literal['PR', 'UR']]] = None,
     dataset: Union[str, Sequence[str]] = None,
     collections: Union[str, Sequence[str]] = None,
     shortName: Union[str, Sequence[str]] = None,
@@ -142,6 +142,7 @@ def search_generator(
     granule_list:
         List of specific granules.
         Search results may include several products per granule name.
+        Supports wildcard queries (*/?)
     groupID:
         Identifier used to find products considered to
         be of the same scene but having different granule names
@@ -215,7 +216,11 @@ def search_generator(
     if maxResults is not None and (
         getattr(opts, 'granule_list', False) or getattr(opts, 'product_list', False)
     ):
-        raise ValueError('Cannot use maxResults along with product_list/granule_list.')
+        names = [] if opts.granule_list is None else opts.granule_list
+        if not any('*' in name or '?' in name for name in names):
+            raise ValueError(
+                'Cannot use maxResults with product_list or non-wildcard granule_list.'
+            )
 
     ASF_LOGGER.debug(f'SEARCH: preprocessing opts: {opts}')
     preprocess_opts(opts)
@@ -258,13 +263,18 @@ def search_generator(
                 f'SUBQUERY {subquery_idx + 1}: Page {page_number} fetched, returned {len(items)} items.'
             )
 
-            if len(items) != INTERNAL.CMR_PAGE_SIZE and len(items) + subquery_count < subquery_max_results:
-                message = 'CMR returned page of incomplete results.' \
-                f'Expected {min(INTERNAL.CMR_PAGE_SIZE, subquery_max_results - subquery_count)} results,' \
-                f'got {len(items)}'
+            if (
+                len(items) != INTERNAL.CMR_PAGE_SIZE
+                and len(items) + subquery_count < subquery_max_results
+            ):
+                message = (
+                    'CMR returned page of incomplete results.'
+                    f'Expected {min(INTERNAL.CMR_PAGE_SIZE, subquery_max_results - subquery_count)} results,'
+                    f'got {len(items)}'
+                )
                 ASF_LOGGER.warning(message)
                 report_search_error(query, message)
-            
+
             opts.session.headers.update({'CMR-Search-After': cmr_search_after_header})
             perf = time.time()
             last_page = process_page(
@@ -409,7 +419,7 @@ def set_default_dates(opts: ASFSearchOptions):
             )
             opts.start, opts.end = opts.end, opts.start
     # Can't do this sooner, since you need to compare start vs end:
-    #TODO python 3.13 deprecation warning, ambiguous date when month specified but not year
+    # TODO python 3.13 deprecation warning, ambiguous date when month specified but not year
     if opts.start is not None:
         opts.start = opts.start.strftime('%Y-%m-%dT%H:%M:%SZ')
     if opts.end is not None:
@@ -456,12 +466,11 @@ def set_platform_alias(opts: ASFSearchOptions):
 
 _dataset_collection_items = dataset_collections.items()
 
+
 def set_science_product_alias(opts: ASFSearchOptions):
     """Alias certain product types (primarily NISAR L0B)"""
     if opts.processingLevel is not None:
-        processingLevelAliases = {
-            'L0B': ['RRSD']
-        }
+        processingLevelAliases = {'L0B': ['RRSD']}
 
         processing_levels = []
         for processing_level in opts.processingLevel:


=====================================
debian/changelog
=====================================
@@ -1,9 +1,12 @@
-asf-search (12.0.6-2) UNRELEASED; urgency=medium
+asf-search (12.0.7-1) unstable; urgency=medium
 
-  * Team upload.
+  [ Bas Couwenberg ]
   * Bump Standards-Version to 4.7.4, no changes.
 
- -- Bas Couwenberg <sebastic at debian.org>  Sat, 04 Apr 2026 10:09:12 +0200
+  [ Antonio Valentino ]
+  * New upstream release.
+
+ -- Antonio Valentino <antonio.valentino at tiscali.it>  Tue, 14 Apr 2026 05:55:01 +0000
 
 asf-search (12.0.6-1) unstable; urgency=medium
 


=====================================
tests/Search/test_search.py
=====================================
@@ -5,6 +5,7 @@ from asf_search import ASFSession
 
 from tenacity import retry, retry_if_exception_type, stop_after_attempt
 from asf_search import ASF_LOGGER
+from asf_search.ASFSearchOptions.validator_map import validator_map
 from asf_search.CMR.subquery import build_subqueries
 from asf_search.CMR.translate import try_parse_date
 from asf_search.constants import INTERNAL
@@ -158,9 +159,9 @@ def run_test_build_subqueries(params: ASFSearchOptions, expected: List):
                         actual_set = set(actual_val)
 
                         difference = expected_set.symmetric_difference(actual_set)
-                        assert (
-                            len(difference) == 0
-                        ), f'Found {len(difference)} missing entries for subquery generated keyword: "{key}"\n{list(difference)}'
+                        assert len(difference) == 0, (
+                            f'Found {len(difference)} missing entries for subquery generated keyword: "{key}"\n{list(difference)}'
+                        )
             else:
                 assert actual_val == expected_val
 
@@ -180,9 +181,54 @@ def run_test_keyword_aliasing_results(params: ASFSearchOptions):
 
     for product in module_response:
         sceneName = product.properties['sceneName']
-        assert api_dict.get(
-            sceneName, False
-        ), f'Found unexpected scene in asf-search module results, {sceneName}\{dict(params)}'
+        assert api_dict.get(sceneName, False), (
+            f'Found unexpected scene in asf-search module results, {sceneName}\{dict(params)}'
+        )
+
+
+def _convert_nested_lists_to_ranges(param_value):
+    return [
+        (param_value[0], param_value[1]) if isinstance(param_value, list) else param_value
+        for param_value in param_value
+    ]
+    pass
+
+
+def run_test_granule_search_patterns(params: dict, output: dict):
+    for param_key, param_value in params.items():
+        validator_method = validator_map.get(param_key)
+        # Convert any nested lists into ranges since yaml doesn't support ()
+        if callable(validator_method) and validator_method.__name__.endswith('_range_list'):
+            if isinstance(param_value, list):
+                params[param_key] = _convert_nested_lists_to_ranges(param_value)
+
+    opts = ASFSearchOptions(**params)
+    response = search(opts=opts)
+    if not output['expect_results']:
+        assert len(response) == 0
+    else:
+        expected_properties: dict = output['expected_properties']
+        for property, value in expected_properties.items():
+            if isinstance(value, list):
+                expanded_list = []
+                for val in value:
+                    if isinstance(val, list):
+                        expanded_list.extend([*range(val[0], val[1] + 1)])
+                    else:
+                        expanded_list.append(val)
+                expected_properties[property] = expanded_list
+
+        for result in response:
+            for property, expected_values in expected_properties.items():
+                if isinstance(expected_values, list):
+                    if isinstance(result.properties[property], list):
+                        assert any(
+                            value in expected_values for value in result.properties[property]
+                        )
+                    else:
+                        assert result.properties[property] in expected_values
+                else:
+                    assert result.properties[property] == expected_values
 
 
 @retry(


=====================================
tests/pytest-config.yml
=====================================
@@ -1,223 +1,228 @@
 # Contents of pytest-config.yml
 test_types:
-
-- For running ASFProduct tests:
-    required_keys: products
-    method: test_ASFProduct
-
-- For running ASFProduct Subproduct tests:
-    required_in_title: ASFSubproduct
-    required_keys: ['scenes', 'expected_subclass']
-    method: test_ASFSubproduct
-
-- For running ASFProduct_Stack tests:
-    required_keys: ["product", "preprocessed_stack", "processed_stack"]
-    required_in_title: ASFProduct_Stack
-    method: test_ASFProduct_Stack
-
-- For running ASFProduct_get_stack_options tests:
-    required_keys: ["product", "options"]
-    required_in_title: ASFProduct-get-stack-options
-    method: test_ASFProduct_get_stack_options
-
-- For running ASFProduct_download_file tests:
-    required_keys: ["product", "filename", "filetype", "additionalUrls"]
-    required_in_title: ASFProduct-download-file
-    method: test_ASFProduct_download
-
-- For running ASFSession tests:
-    required_in_title: password-login
-    required_keys: ['username', 'password']
-    method: test_ASFSession_Error
-
-- For running ASFSession token_auth tests:
-    required_in_title: token-auth
-    required_keys: token
-    method: test_ASFSession_Token_Error
-
-- For running ASFSession cookiejar_auth tests:
-    required_in_title: cookiejar-auth
-    required_keys: cookies
-    method: test_ASFSession_Cookie_Error
-
-- For running ASFSession rebuild_auth tests:
-    required_in_title: rebuild_auth
-    required_keys: ['original_domain', 'response_domain', 'response_code', 'final_token']
-    method: test_asf_session_rebuild_auth
-
-- For running preprocessed baseline stack params tests:
-    required_keys: product
-    required_in_title: test-preprocessed-product
-    method: test_get_preprocessed_stack_params
-
-- For running unprocessed baseline stack params tests:
-    required_keys: product
-    required_in_title: test-unprocessed-product
-    method: test_get_unprocessed_stack_params
-
-- For running Invalid Stack ID stack params tests:
-    required_keys: product
-    required_in_title: test-invalid-insarStackID
-    method: test_get_stack_opts_invalid_insarStackId
-
-- For running Invalid Platform stack params tests:
-    required_keys: ["product", "stack"]
-    required_in_title: test-temporal-baseline
-    method: test_temporal_baseline
-
-- For running Invalid Platform stack params tests:
-    required_keys: ["product", "stack"]
-    required_in_title: test-product-stack
-    method: test_stack_from_product
-
-- For running stack_from_id tests:
-    required_keys: ["stack_id", "stack", "stack_reference"]
-    required_in_title: test-stack-id
-    method: test_stack_from_id
-
-- For running stack from ASFSearch tests:
-    required_keys: response
-    required_in_title: test-ASFSearch
-    method: test_ASFSearchResults
-
-- For ASFSearch search with parameters tests:
-    required_keys: ["parameters", "answer"]
-    required_in_title: test-ASFSearch-search-valid
-    method: test_ASFSearch_Search
-
-- For ASFSearch search_generator with parameters tests:
-    required_keys: parameters
-    required_in_title: test-ASFSearch-search-valid
-    method: test_ASFSearch_Search_Generator
-
-- For running ASFSearch search error tests:
-    required_keys: ["parameters", "status_code", "report"]
-    required_in_title: test-ASFSearch-search-error
-    method: test_ASFSearch_Search_Error
-
-- For running WKT Validation invalid wkt error tests:
-    required_keys: wkt
-    required_in_title: 'test-validate-wkt-invalid-error'
-    method: test_wkt_validation_Invalid_WKT_Error
-
-- For running WKT Validation point tests:
-    required_keys: ["wkt", "validated-wkt"]
-    required_in_title: 'test-validate-wkt-valid'
-    method: test_wkt_validation_WKT_Valid
-
-- For running _get_clamped_and_wrapped_geometry tests:
-    required_keys: ["wkt", "clamped-wkt", "clamped-count", "wrapped-count"]
-    required_in_title: test-validate-wkt-clamp
-    method: test_wkt_validation_WKT_clamp_geometry
-
-- For running _get_convex_hull tests:
-    required_keys: ["wkt", "convex-wkt"]
-    required_in_title: test-validate-wkt-convex-hull
-    method: test_wkt_validation_convex_hull
-
-- For running _get_convex_hull tests:
-    required_keys: ["wkt", "merged-wkt"]
-    required_in_title: test-validate-wkt-merge-overlapping-geometry
-    method: test_wkt_validation_merge_overlapping_geometry
-
-- For running _counter_clockwise_reorientation tests:
-    required_keys: ["wkt", "cc-wkt"]
-    required_in_title: test-validate-wkt-reorient
-    method: test_wkt_validation_counter_clockwise_reorientation
-
-- For running _wkt_prep tests:
-    required_keys: wkt
-    required_in_title: test-search-wkt-prep
-    method: test_search_wkt_prep
-
-- For running _simplify_aoi tests:
-    required_keys: ["wkt", "simplified-wkt", "RepairEntries"]
-    required_in_title: test-simplify-aoi
-    method: test_simplify_aoi
-
-- For running _get_project_names tests:
-    required_keys: ["cmr_ummjson", "campaigns"]
-    required_in_title: test_get_project_names
-    method: test_get_platform_campaign_names
-
-- For running _get_project_names tests:
-    required_keys: ["wkt", "coordinates"]
-    required_in_title: test-validate-wkt-get-shape-coords
-    method: test_validate_wkt_get_shape_coords
-
-- For running ASFSearchResults_intersection tests:
-    required_keys: ["wkt"]
-    required_in_title: ASFSearchResults_intersection
-    method: test_ASFSearchResults_intersection
-
-- For running download_url tests:
-    required_keys: ["url", "path", "filename"]
-    required_in_title: test-download-url
-    method: test_download_url
-
-- For running find_new_reference tests:
-    required_keys: ["stack", "output_index"]
-    required_in_title: test-find-new-reference
-    method: test_find_new_reference
-
-- For running test_get_default_product_type tests:
-    required_keys: ["product", "product_type"]
-    required_in_title: test-get_default_product_type
-    method: test_get_default_product_type
-
-- For running test_get_baseline_from_stack tests:
-    required_keys: ['reference', 'stack', 'output_stack', 'error']
-    required_in_title: test-get-baseline-from-stack
-    method: test_get_baseline_from_stack
-
-- For running test_get_default_product_type tests:
-    required_keys: ["reference", "output"]
-    required_in_title: test-valid-state-vectors
-    method: test_valid_state_vectors
-
-- For running test_validator_map_validate tests:
-    required_keys: ['key', 'value', 'output']
-    required_in_title: test-validator-map-validate
-    method: test_validator_map_validate
-
-- For running ASFSearchOption-validator tests:
-    required_keys: ['validator', 'input', 'output', 'error']
-    required_in_title: test-validators
-    method: test_ASFSearchOptions_validator
-
-- For running ASFSearchOptions tests:
-    required_in_title: test-ASFSearchOptions
-    method: test_ASFSearchOptions
-
-- For running serialization tests:
-    required_in_title: serialization
-    method: test_serialization
-
-# - For running ASFSearchOptions tests:
-#     required_in_title: ASFSearchResults-format
-#     required_keys: results
-#     method: test_output_format
-
-- For running search-api keyword-collection aliasing tests:
-    required_in_title: test-aliasing-search-against-api
-    required_keys: params
-    method: test_keyword_aliasing_results
-
-- For running dataset keyword tests:
-    required_in_title: search-dataset
-    required_keys: dataset
-    method: test_search_dataset
-
-- For running build_subquery tests:
-    required_in_title: search-build_subquery
-    required_keys: ['params', 'expected']
-    method: test_build_subqueries
-
-- For running collection_attributes tests:
-    required_in_title: test-collection-attributes
-    required_keys: ['params', 'expected_attributes']
-    method: test_collection_attributes
-
-- For running jupyter notebook example tests:
-    required_keys: notebook
-    method: test_notebook_examples
+  - For running ASFProduct tests:
+      required_keys: products
+      method: test_ASFProduct
+
+  - For running ASFProduct Subproduct tests:
+      required_in_title: ASFSubproduct
+      required_keys: ["scenes", "expected_subclass"]
+      method: test_ASFSubproduct
+
+  - For running ASFProduct_Stack tests:
+      required_keys: ["product", "preprocessed_stack", "processed_stack"]
+      required_in_title: ASFProduct_Stack
+      method: test_ASFProduct_Stack
+
+  - For running ASFProduct_get_stack_options tests:
+      required_keys: ["product", "options"]
+      required_in_title: ASFProduct-get-stack-options
+      method: test_ASFProduct_get_stack_options
+
+  - For running ASFProduct_download_file tests:
+      required_keys: ["product", "filename", "filetype", "additionalUrls"]
+      required_in_title: ASFProduct-download-file
+      method: test_ASFProduct_download
+
+  - For running ASFSession tests:
+      required_in_title: password-login
+      required_keys: ["username", "password"]
+      method: test_ASFSession_Error
+
+  - For running ASFSession token_auth tests:
+      required_in_title: token-auth
+      required_keys: token
+      method: test_ASFSession_Token_Error
+
+  - For running ASFSession cookiejar_auth tests:
+      required_in_title: cookiejar-auth
+      required_keys: cookies
+      method: test_ASFSession_Cookie_Error
+
+  - For running ASFSession rebuild_auth tests:
+      required_in_title: rebuild_auth
+      required_keys:
+        ["original_domain", "response_domain", "response_code", "final_token"]
+      method: test_asf_session_rebuild_auth
+
+  - For running preprocessed baseline stack params tests:
+      required_keys: product
+      required_in_title: test-preprocessed-product
+      method: test_get_preprocessed_stack_params
+
+  - For running unprocessed baseline stack params tests:
+      required_keys: product
+      required_in_title: test-unprocessed-product
+      method: test_get_unprocessed_stack_params
+
+  - For running Invalid Stack ID stack params tests:
+      required_keys: product
+      required_in_title: test-invalid-insarStackID
+      method: test_get_stack_opts_invalid_insarStackId
+
+  - For running Invalid Platform stack params tests:
+      required_keys: ["product", "stack"]
+      required_in_title: test-temporal-baseline
+      method: test_temporal_baseline
+
+  - For running Invalid Platform stack params tests:
+      required_keys: ["product", "stack"]
+      required_in_title: test-product-stack
+      method: test_stack_from_product
+
+  - For running stack_from_id tests:
+      required_keys: ["stack_id", "stack", "stack_reference"]
+      required_in_title: test-stack-id
+      method: test_stack_from_id
+
+  - For running stack from ASFSearch tests:
+      required_keys: response
+      required_in_title: test-ASFSearch
+      method: test_ASFSearchResults
+
+  - For ASFSearch search with parameters tests:
+      required_keys: ["parameters", "answer"]
+      required_in_title: test-ASFSearch-search-valid
+      method: test_ASFSearch_Search
+
+  - For ASFSearch search_generator with parameters tests:
+      required_keys: parameters
+      required_in_title: test-ASFSearch-search-valid
+      method: test_ASFSearch_Search_Generator
+
+  - For running ASFSearch search error tests:
+      required_keys: ["parameters", "status_code", "report"]
+      required_in_title: test-ASFSearch-search-error
+      method: test_ASFSearch_Search_Error
+
+  - For running WKT Validation invalid wkt error tests:
+      required_keys: wkt
+      required_in_title: "test-validate-wkt-invalid-error"
+      method: test_wkt_validation_Invalid_WKT_Error
+
+  - For running WKT Validation point tests:
+      required_keys: ["wkt", "validated-wkt"]
+      required_in_title: "test-validate-wkt-valid"
+      method: test_wkt_validation_WKT_Valid
+
+  - For running _get_clamped_and_wrapped_geometry tests:
+      required_keys: ["wkt", "clamped-wkt", "clamped-count", "wrapped-count"]
+      required_in_title: test-validate-wkt-clamp
+      method: test_wkt_validation_WKT_clamp_geometry
+
+  - For running _get_convex_hull tests:
+      required_keys: ["wkt", "convex-wkt"]
+      required_in_title: test-validate-wkt-convex-hull
+      method: test_wkt_validation_convex_hull
+
+  - For running _get_convex_hull tests:
+      required_keys: ["wkt", "merged-wkt"]
+      required_in_title: test-validate-wkt-merge-overlapping-geometry
+      method: test_wkt_validation_merge_overlapping_geometry
+
+  - For running _counter_clockwise_reorientation tests:
+      required_keys: ["wkt", "cc-wkt"]
+      required_in_title: test-validate-wkt-reorient
+      method: test_wkt_validation_counter_clockwise_reorientation
+
+  - For running _wkt_prep tests:
+      required_keys: wkt
+      required_in_title: test-search-wkt-prep
+      method: test_search_wkt_prep
+
+  - For running _simplify_aoi tests:
+      required_keys: ["wkt", "simplified-wkt", "RepairEntries"]
+      required_in_title: test-simplify-aoi
+      method: test_simplify_aoi
+
+  - For running _get_project_names tests:
+      required_keys: ["cmr_ummjson", "campaigns"]
+      required_in_title: test_get_project_names
+      method: test_get_platform_campaign_names
+
+  - For running _get_project_names tests:
+      required_keys: ["wkt", "coordinates"]
+      required_in_title: test-validate-wkt-get-shape-coords
+      method: test_validate_wkt_get_shape_coords
+
+  - For running ASFSearchResults_intersection tests:
+      required_keys: ["wkt"]
+      required_in_title: ASFSearchResults_intersection
+      method: test_ASFSearchResults_intersection
+
+  - For running download_url tests:
+      required_keys: ["url", "path", "filename"]
+      required_in_title: test-download-url
+      method: test_download_url
+
+  - For running find_new_reference tests:
+      required_keys: ["stack", "output_index"]
+      required_in_title: test-find-new-reference
+      method: test_find_new_reference
+
+  - For running test_get_default_product_type tests:
+      required_keys: ["product", "product_type"]
+      required_in_title: test-get_default_product_type
+      method: test_get_default_product_type
+
+  - For running test_get_baseline_from_stack tests:
+      required_keys: ["reference", "stack", "output_stack", "error"]
+      required_in_title: test-get-baseline-from-stack
+      method: test_get_baseline_from_stack
+
+  - For running test_get_default_product_type tests:
+      required_keys: ["reference", "output"]
+      required_in_title: test-valid-state-vectors
+      method: test_valid_state_vectors
+
+  - For running test_validator_map_validate tests:
+      required_keys: ["key", "value", "output"]
+      required_in_title: test-validator-map-validate
+      method: test_validator_map_validate
+
+  - For running ASFSearchOption-validator tests:
+      required_keys: ["validator", "input", "output", "error"]
+      required_in_title: test-validators
+      method: test_ASFSearchOptions_validator
+
+  - For running ASFSearchOptions tests:
+      required_in_title: test-ASFSearchOptions
+      method: test_ASFSearchOptions
+
+  - For running serialization tests:
+      required_in_title: serialization
+      method: test_serialization
+
+  # - For running ASFSearchOptions tests:
+  #     required_in_title: ASFSearchResults-format
+  #     required_keys: results
+  #     method: test_output_format
+
+  - For running search-api keyword-collection aliasing tests:
+      required_in_title: test-aliasing-search-against-api
+      required_keys: params
+      method: test_keyword_aliasing_results
+
+  - For running dataset keyword tests:
+      required_in_title: search-dataset
+      required_keys: dataset
+      method: test_search_dataset
+
+  - For running build_subquery tests:
+      required_in_title: search-build_subquery
+      required_keys: ["params", "expected"]
+      method: test_build_subqueries
+
+  - For running collection_attributes tests:
+      required_in_title: test-collection-attributes
+      required_keys: ["params", "expected_attributes"]
+      method: test_collection_attributes
+
+  - For running granule-search-patterns tests:
+      required_in_title: test-granule-search-patterns
+      required_keys: [params, output]
+      method: test_granule_search_patterns
+
+  - For running jupyter notebook example tests:
+      required_keys: notebook
+      method: test_notebook_examples


=====================================
tests/pytest-managers.py
=====================================
@@ -31,6 +31,7 @@ from Search.test_search import (
     run_test_ASFSearchResults,
     run_test_build_subqueries,
     run_test_dataset_search,
+    run_test_granule_search_patterns,
     run_test_keyword_aliasing_results,
     run_test_search,
     run_test_search_http_error,
@@ -93,11 +94,12 @@ def test_ASFProduct(**args) -> None:
     geographic_response = get_resource(test_info['products'])
     run_test_ASFProduct(geographic_response)
 
+
 def test_ASFSubproduct(**args) -> None:
     """
     Tests ASFProduct subclasses for properties and basic functionality
     """
-    session = args["config"].getoption("authenticated_session")
+    session = args['config'].getoption('authenticated_session')
 
     test_info = args['test_info']
     scene_names = test_info['scenes']
@@ -105,7 +107,8 @@ def test_ASFSubproduct(**args) -> None:
     opts = ASFSearchOptions(**test_info.get('opts', {}), session=session)
 
     run_test_ASFSubproduct(scene_names=scene_names, expected_subclass=expected_subclass, opts=opts)
-    
+
+
 def test_ASFProduct_Stack(**args) -> None:
     """
     Tests ASFProduct.stack() with reference and corresponding stack
@@ -583,6 +586,13 @@ def test_build_subqueries(**kwargs) -> None:
     run_test_build_subqueries(params, expected)
 
 
+def test_granule_search_patterns(**args):
+    test_info = args['test_info']
+    params = test_info['params']
+    output = test_info['output']
+    run_test_granule_search_patterns(params, output)
+
+
 def test_serialization(**args) -> None:
     test_info = args['test_info']
     product = get_resource(test_info.get('product'))
@@ -643,13 +653,15 @@ def test_keyword_aliasing_results(**args) -> None:
 
     run_test_keyword_aliasing_results(opts)
 
+
 def test_collection_attributes(**args) -> None:
     params = args['test_info']['params']
     expected_attributes = args['test_info']['expected_attributes']
     expect_failure = args['test_info'].get('expect_failure', False)
-    session = args["config"].getoption("authenticated_session")
+    session = args['config'].getoption('authenticated_session')
     run_test_collection_attributes(params, expected_attributes, session, expect_failure)
 
+
 # Finds and loads file from yml_tests/Resouces/ if loaded field ends with .yml/yaml extension
 def get_resource(yml_file):
     if isinstance(yml_file, str):


=====================================
tests/yml_tests/test_search.yml
=====================================
@@ -175,186 +175,185 @@ sentinel-1_collections: &sentinel-1_collections
   - "C1257175154-ASFDEV"
   - "C1244598379-ASFDEV"
 
-nisar_collections: &nisar_collections
-  [
-        # UAT ASFDEV
-        'C1261815181-ASFDEV',
-        'C1261832381-ASFDEV',
-        'C1256533420-ASFDEV',
-        'C1261813453-ASFDEV',
-        'C1261832466-ASFDEV',
-        'C1256524081-ASFDEV',
-        'C1261815274-ASFDEV',
-        'C1273126538-ASFDEV',
-        'C1273126543-ASFDEV',
-        'C1261813489-ASFDEV',
-        'C1273095152-ASFDEV',
-        'C1273095154-ASFDEV',
-        'C1261819086-ASFDEV',
-        'C1273095181-ASFDEV',
-        'C1273095184-ASFDEV',
-        'C1261819098-ASFDEV',
-        'C1273152981-ASFDEV',
-        'C1273152983-ASFDEV',
-        'C1261819110-ASFDEV',
-        'C1273153081-ASFDEV',
-        'C1273153083-ASFDEV',
-        'C1261819167-ASFDEV',
-        'C1273181122-ASFDEV',
-        'C1273181124-ASFDEV',
-        'C1261819168-ASFDEV',
-        'C1273304471-ASFDEV',
-        'C1273304473-ASFDEV',
-        'C1261819211-ASFDEV',
-        'C1273304517-ASFDEV',
-        'C1273304519-ASFDEV',
-        'C1261819233-ASFDEV',
-        'C1273304466-ASFDEV',
-        'C1273304468-ASFDEV',
-        'C1273421239-ASFDEV',
-        'C1273410799-ASFDEV',
-        'C1273410801-ASFDEV',
-        'C1262134528-ASFDEV',
-        'C1258125097-ASFDEV',
-        'C1258290319-ASFDEV',
-        'C1258301530-ASFDEV',
-        'C1261630276-ASFDEV',
-        'C1256574227-ASFDEV',
-        'C1256579794-ASFDEV',
-        'C1256729502-ASFDEV',
-        'C1256535568-ASFDEV',
-        'C1256578011-ASFDEV',
-        'C1256802323-ASFDEV',
-        'C1276806641-ASFDEV',
-        'C1256535570-ASFDEV',
-        'C1275622488-ASFDEV',
-        # 'C1276777683-ASFDEV',
-        # 'C1280516237-ASFDEV',
-        # 'C1274178360-ASFDEV',
-        # 'C1276991363-ASFDEV',
-        # 'C1261815276-ASFDEV',
-        # 'C1261832632-ASFDEV',
-        # 'C1256358463-ASFDEV',
-        # 'C1274178363-ASFDEV',
-        # UAT
-        'C1261815288-ASF',
-        'C1261832657-ASF',
-        'C1257349121-ASF',
-        'C1273831241-ASF',
-        'C1261832658-ASF',
-        'C1257349120-ASF',
-        'C1273831320-ASF',
-        'C1273445045-ASF',
-        'C1273445159-ASF',
-        'C1273831203-ASF',
-        'C1273153208-ASF',
-        'C1273831205-ASF',
-        'C1273831200-ASF',
-        'C1273153326-ASF',
-        'C1273287787-ASF',
-        'C1261819121-ASF',
-        'C1273220358-ASF',
-        'C1273220386-ASF',
-        'C1261819145-ASF',
-        'C1273316385-ASF',
-        'C1273316399-ASF',
-        'C1273831198-ASF',
-        'C1273397067-ASF',
-        'C1273397074-ASF',
-        'C1261819270-ASF',
-        'C1273424673-ASF',
-        'C1273424675-ASF',
-        'C1273831195-ASF',
-        'C1273428591-ASF',
-        'C1273428593-ASF',
-        'C1261819281-ASF',
-        'C1273429896-ASF',
-        'C1273429898-ASF',
-        'C1273553457-ASF',
-        'C1273602244-ASF',
-        'C1273602265-ASF',
-        'C1262135006-ASF',
-        'C1258836794-ASF',
-        'C1273831207-ASF',
-        'C1258836800-ASF',
-        'C1261712879-ASF',
-        'C1257349088-ASF',
-        'C1257349083-ASF',
-        'C1257349067-ASF',
-        'C1257349089-ASF',
-        'C1257349074-ASF',
-        'C1257349063-ASF',
-        'C1257349059-ASF',
-        'C1257349082-ASF',
-        'C1275622548-ASF',
-        'C1274178507-ASF',
-        # 'C1274665933-ASF',
-        # 'C1280516250-ASF',
-        # 'C1274178361-ASF',
-        # 'C1274177987-ASF',
-        # 'C1273831262-ASF',
-        # 'C1261832671-ASF',
-        # 'C1257349114-ASF',
-        # 'C1274178365-ASF',
-        # PROD
-        'C2850220296-ASF',
-        'C2853068083-ASF',
-        'C2727902012-ASF',
-        'C2850223384-ASF',
-        'C2853086824-ASF',
-        'C3622203972-ASF',
-        'C3622228339-ASF',
-        'C2853089814-ASF',
-        'C3622265756-ASF',
-        'C2850225585-ASF',
-        'C2853145197-ASF',
-        'C3622236985-ASF',
-        'C2850234202-ASF',
-        'C2853147928-ASF',
-        'C3622229381-ASF',
-        'C2850235455-ASF',
-        'C2853153429-ASF',
-        'C3622237369-ASF',
-        'C2850237619-ASF',
-        'C2853156054-ASF',
-        'C3622241997-ASF',
-        'C2850259510-ASF',
-        'C2854332392-ASF',
-        'C3622244601-ASF',
-        'C2850261892-ASF',
-        'C2854335566-ASF',
-        'C3622247503-ASF',
-        'C3622214170-ASF',
-        'C2854338529-ASF',
-        'C3622241360-ASF',
-        'C2850263910-ASF',
-        'C2854341702-ASF',
-        'C3622250865-ASF',
-        'C2850265000-ASF',
-        'C2854344945-ASF',
-        'C3622248530-ASF',
-        'C2874824964-ASF',
-        'C2887469134-ASF',
-        'C2887499907-ASF',
-        'C2887502657-ASF',
-        'C3622222871-ASF',
-        'C2727908375-ASF',
-        'C2727912431-ASF',
-        'C3622253574-ASF',
-        'C3622233495-ASF',
-        'C2727911748-ASF',
-        'C3622219145-ASF',
-        'C3622216140-ASF',
-        'C2727904608-ASF',
-        'C3632501432-ASF',
-        'C3653529349-ASF',
-        # 'C3803703055-ASF',
-        # 'C4066106685-ASF',
-        # 'C3807638962-ASF',
-        # 'C2850225137-ASF',
-        # 'C2853091612-ASF',
-        # 'C3622254588-ASF',
-        # 'C3852453107-ASF',
+nisar_collections: &nisar_collections [
+    # UAT ASFDEV
+    "C1261815181-ASFDEV",
+    "C1261832381-ASFDEV",
+    "C1256533420-ASFDEV",
+    "C1261813453-ASFDEV",
+    "C1261832466-ASFDEV",
+    "C1256524081-ASFDEV",
+    "C1261815274-ASFDEV",
+    "C1273126538-ASFDEV",
+    "C1273126543-ASFDEV",
+    "C1261813489-ASFDEV",
+    "C1273095152-ASFDEV",
+    "C1273095154-ASFDEV",
+    "C1261819086-ASFDEV",
+    "C1273095181-ASFDEV",
+    "C1273095184-ASFDEV",
+    "C1261819098-ASFDEV",
+    "C1273152981-ASFDEV",
+    "C1273152983-ASFDEV",
+    "C1261819110-ASFDEV",
+    "C1273153081-ASFDEV",
+    "C1273153083-ASFDEV",
+    "C1261819167-ASFDEV",
+    "C1273181122-ASFDEV",
+    "C1273181124-ASFDEV",
+    "C1261819168-ASFDEV",
+    "C1273304471-ASFDEV",
+    "C1273304473-ASFDEV",
+    "C1261819211-ASFDEV",
+    "C1273304517-ASFDEV",
+    "C1273304519-ASFDEV",
+    "C1261819233-ASFDEV",
+    "C1273304466-ASFDEV",
+    "C1273304468-ASFDEV",
+    "C1273421239-ASFDEV",
+    "C1273410799-ASFDEV",
+    "C1273410801-ASFDEV",
+    "C1262134528-ASFDEV",
+    "C1258125097-ASFDEV",
+    "C1258290319-ASFDEV",
+    "C1258301530-ASFDEV",
+    "C1261630276-ASFDEV",
+    "C1256574227-ASFDEV",
+    "C1256579794-ASFDEV",
+    "C1256729502-ASFDEV",
+    "C1256535568-ASFDEV",
+    "C1256578011-ASFDEV",
+    "C1256802323-ASFDEV",
+    "C1276806641-ASFDEV",
+    "C1256535570-ASFDEV",
+    "C1275622488-ASFDEV",
+    # 'C1276777683-ASFDEV',
+    # 'C1280516237-ASFDEV',
+    # 'C1274178360-ASFDEV',
+    # 'C1276991363-ASFDEV',
+    # 'C1261815276-ASFDEV',
+    # 'C1261832632-ASFDEV',
+    # 'C1256358463-ASFDEV',
+    # 'C1274178363-ASFDEV',
+    # UAT
+    "C1261815288-ASF",
+    "C1261832657-ASF",
+    "C1257349121-ASF",
+    "C1273831241-ASF",
+    "C1261832658-ASF",
+    "C1257349120-ASF",
+    "C1273831320-ASF",
+    "C1273445045-ASF",
+    "C1273445159-ASF",
+    "C1273831203-ASF",
+    "C1273153208-ASF",
+    "C1273831205-ASF",
+    "C1273831200-ASF",
+    "C1273153326-ASF",
+    "C1273287787-ASF",
+    "C1261819121-ASF",
+    "C1273220358-ASF",
+    "C1273220386-ASF",
+    "C1261819145-ASF",
+    "C1273316385-ASF",
+    "C1273316399-ASF",
+    "C1273831198-ASF",
+    "C1273397067-ASF",
+    "C1273397074-ASF",
+    "C1261819270-ASF",
+    "C1273424673-ASF",
+    "C1273424675-ASF",
+    "C1273831195-ASF",
+    "C1273428591-ASF",
+    "C1273428593-ASF",
+    "C1261819281-ASF",
+    "C1273429896-ASF",
+    "C1273429898-ASF",
+    "C1273553457-ASF",
+    "C1273602244-ASF",
+    "C1273602265-ASF",
+    "C1262135006-ASF",
+    "C1258836794-ASF",
+    "C1273831207-ASF",
+    "C1258836800-ASF",
+    "C1261712879-ASF",
+    "C1257349088-ASF",
+    "C1257349083-ASF",
+    "C1257349067-ASF",
+    "C1257349089-ASF",
+    "C1257349074-ASF",
+    "C1257349063-ASF",
+    "C1257349059-ASF",
+    "C1257349082-ASF",
+    "C1275622548-ASF",
+    "C1274178507-ASF",
+    # 'C1274665933-ASF',
+    # 'C1280516250-ASF',
+    # 'C1274178361-ASF',
+    # 'C1274177987-ASF',
+    # 'C1273831262-ASF',
+    # 'C1261832671-ASF',
+    # 'C1257349114-ASF',
+    # 'C1274178365-ASF',
+    # PROD
+    "C2850220296-ASF",
+    "C2853068083-ASF",
+    "C2727902012-ASF",
+    "C2850223384-ASF",
+    "C2853086824-ASF",
+    "C3622203972-ASF",
+    "C3622228339-ASF",
+    "C2853089814-ASF",
+    "C3622265756-ASF",
+    "C2850225585-ASF",
+    "C2853145197-ASF",
+    "C3622236985-ASF",
+    "C2850234202-ASF",
+    "C2853147928-ASF",
+    "C3622229381-ASF",
+    "C2850235455-ASF",
+    "C2853153429-ASF",
+    "C3622237369-ASF",
+    "C2850237619-ASF",
+    "C2853156054-ASF",
+    "C3622241997-ASF",
+    "C2850259510-ASF",
+    "C2854332392-ASF",
+    "C3622244601-ASF",
+    "C2850261892-ASF",
+    "C2854335566-ASF",
+    "C3622247503-ASF",
+    "C3622214170-ASF",
+    "C2854338529-ASF",
+    "C3622241360-ASF",
+    "C2850263910-ASF",
+    "C2854341702-ASF",
+    "C3622250865-ASF",
+    "C2850265000-ASF",
+    "C2854344945-ASF",
+    "C3622248530-ASF",
+    "C2874824964-ASF",
+    "C2887469134-ASF",
+    "C2887499907-ASF",
+    "C2887502657-ASF",
+    "C3622222871-ASF",
+    "C2727908375-ASF",
+    "C2727912431-ASF",
+    "C3622253574-ASF",
+    "C3622233495-ASF",
+    "C2727911748-ASF",
+    "C3622219145-ASF",
+    "C3622216140-ASF",
+    "C2727904608-ASF",
+    "C3632501432-ASF",
+    "C3653529349-ASF",
+    # 'C3803703055-ASF',
+    # 'C4066106685-ASF',
+    # 'C3807638962-ASF',
+    # 'C2850225137-ASF',
+    # 'C2853091612-ASF',
+    # 'C3622254588-ASF',
+    # 'C3852453107-ASF',
   ]
 
 tests:
@@ -370,21 +369,21 @@ tests:
   - test-ASFSearch-search-error 400-Error:
       parameters: {}
       status_code: 400
-      report: 'Client Error: This is a Test Error'
+      report: "Client Error: This is a Test Error"
   - test-ASFSearch-search-error 400-Error non-empty-results:
       parameters:
         platform: Sentinel-1
       status_code: 400
-      report: 'Client Error: This is a Test Error'
+      report: "Client Error: This is a Test Error"
   - test-ASFSearch-search-error 500-Error:
       parameters: {}
       status_code: 500
-      report: 'Server Error: This is a Test Error'
+      report: "Server Error: This is a Test Error"
   - test-ASFSearch-search-error 500-Error non-empty-results:
       parameters:
         platform: Sentinel-1
       status_code: 500
-      report: 'Server Error: This is a Test Error'
+      report: "Server Error: This is a Test Error"
   - test-search-dataset S1 Datasets:
       dataset:
         - SENTINEL-1
@@ -423,12 +422,7 @@ tests:
           - L0B
         dataset:
           - NISAR
-      expected: [
-        {
-        processingLevel: ['RRSD'],
-        collections: *nisar_collections
-        }
-      ]
+      expected: [{ processingLevel: ["RRSD"], collections: *nisar_collections }]
 
   - test-search-build_subquery S1-Platform SLC:
       params:
@@ -439,12 +433,12 @@ tests:
           - SLC
       expected:
         - collections:
-          - 'C1205428742-ASF'
-          - 'C1214470488-ASF'
-          - 'C1216244348-ASF'
-          - 'C1234413245-ASFDEV'
-          - 'C1234413263-ASFDEV'
-          - 'C1327985661-ASF'
+            - "C1205428742-ASF"
+            - "C1214470488-ASF"
+            - "C1216244348-ASF"
+            - "C1234413245-ASFDEV"
+            - "C1234413263-ASFDEV"
+            - "C1327985661-ASF"
   - test-search-build_subquery S1-Dataset SLC:
       params:
         dataset:
@@ -516,9 +510,7 @@ tests:
       params:
         processingLevel:
           - UNKNOWN_PROCESSING_TYPE
-      expected: [
-        {processingLevel: [UNKNOWN_PROCESSING_TYPE]}
-      ]
+      expected: [{ processingLevel: [UNKNOWN_PROCESSING_TYPE] }]
   - test-search-build_subquery UNKNOWN_PROCESSING_TYPE with collections:
       params:
         processingLevel:
@@ -531,38 +523,32 @@ tests:
           - C1216244348-ASF
           - C1234413263-ASFDEV
           - C1212001698-ASF
-      expected: [
-        {
-        processingLevel: [UNKNOWN_PROCESSING_TYPE],
-        collections: [C1214470488-ASF,
-            C1205428742-ASF,
-            C1234413245-ASFDEV,
-            C1327985661-ASF,
-            C1216244348-ASF,
-            C1234413263-ASFDEV,
-            C1212001698-ASF]
-        }
-      ]
+      expected:
+        [
+          {
+            processingLevel: [UNKNOWN_PROCESSING_TYPE],
+            collections:
+              [
+                C1214470488-ASF,
+                C1205428742-ASF,
+                C1234413245-ASFDEV,
+                C1327985661-ASF,
+                C1216244348-ASF,
+                C1234413263-ASFDEV,
+                C1212001698-ASF,
+              ],
+          },
+        ]
   - test-search-build_subquery mismatched processingLevel for platform:
       params:
         processingLevel: METADATA
         platform: NISAR
-      expected: [
-        {
-        processingLevel: [METADATA],
-        platform: [NISAR]
-        }
-      ]
+      expected: [{ processingLevel: [METADATA], platform: [NISAR] }]
   - test-search-build_subquery mismatched processingLevel for platform CSLC and S1A:
       params:
         processingLevel: METADATA
         platform: SENTINEL-1A
-      expected: [
-        {
-        processingLevel: [METADATA],
-        platform: [SENTINEL-1A]
-        }
-      ]
+      expected: [{ processingLevel: [METADATA], platform: [SENTINEL-1A] }]
   - test-search-build_subquery UNKNOWN_PROCESSING_TYPE with platform, SLC, & collection (skip set difference with unknown processing level):
       params:
         platform:
@@ -574,295 +560,303 @@ tests:
           - SLC
         collections:
           - C1212001698-ASF
-      expected: [{
-        processingLevel: UNKNOWN_PROCESSING_TYPE,
-        collections: [
-            "C1214353986-ASF",
-            "C1214336045-ASF",
-            "C1261881077-ASF",
-            "C2859376221-ASF",
-            "C1214336717-ASF",
-            "C1214335430-ASF",
-            "C1214335471-ASF",
-            "C1214335903-ASF",
-            "C1214336154-ASF",
-            "C1214336554-ASF",
-            "C1214353593-ASF",
-            "C1214353754-ASF",
-            "C1214353859-ASF",
-            "C1214337770-ASF",
-            "C1214354144-ASF",
-            "C1214354235-ASF",
-            "C1214343609-ASF",
-            "C1214354031-ASF",
-            "C1214408428-ASF",
-            "C1214419355-ASF",
-            "C1210487703-ASF",
-            "C1212030772-ASF",
-            "C1206116665-ASF",
-            "C1206132445-ASF",
-            "C1211962154-ASF",
-            "C1212001698-ASF",
-            "C1212005594-ASF",
-            "C1212019993-ASF",
-            "C1207638502-ASF",
-            "C1210025872-ASF",
-            "C1210485039-ASF",
-            "C1207188317-ASF",
-            "C1210546638-ASF",
-            "C1206122195-ASF",
-            "C1209970710-ASF",
-            "C1207038647-ASF",
-            "C1210599503-ASF",
-            "C1210599673-ASF",
-            "C1214470488-ASF",
-            "C1205428742-ASF",
-            "C1234413245-ASFDEV",
-            "C1327985661-ASF",
-            "C1216244348-ASF",
-            "C1234413263-ASFDEV",
-            "C2803501758-ASF", # OPERA
-            "C2803501097-ASF", # OPERA
-            "C1214470488-ASF", # S1A
-            "C1214470533-ASF",
-            "C1214470576-ASF",
-            "C1595422627-ASF",
-            "C1214470496-ASF",
-            "C1214470532-ASF",
-            "C1214472977-ASF",
-            "C1214472336-ASF",
-            "C1266376001-ASF",
-            "C1214472994-ASF",
-            "C1214470732-ASF",
-            "C1214473170-ASF",
-            "C1214470561-ASF",
-            "C1214471521-ASF",
-            "C1214470682-ASF",
-            "C2777443834-ASF",
-            "C2777436413-ASF",
-            "C1214471197-ASF",
-            "C1214471960-ASF",
-            "C1214472978-ASF",
-            "C1214473165-ASF",
-            "C2709161906-ASF",
-            "C1596065640-ASF",
-            "C1596065639-ASF",
-            "C1596065641-ASF",
-            "C1595765183-ASF",
-            "C2450786986-ASF",
-            "C1205428742-ASF",
-            "C1212201032-ASF",
-            "C1212212560-ASF",
-            "C1205264459-ASF",
-            "C1208117434-ASF",
-            "C1212209035-ASF",
-            "C1212209226-ASF",
-            "C1208115009-ASF",
-            "C1212158327-ASF",
-            "C1215704763-ASF",
-            "C1225776654-ASF",
-            "C1212158318-ASF",
-            "C1212212493-ASF",
-            "C1212158326-ASF",
-            "C1212233976-ASF",
-            "C1260726384-ASF",
-            "C1258354200-ASF",
-            "C1259982010-ASF",
-            "C2795135668-ASF",
-            "C1260721945-ASF",
-            "C1257995185-ASF",
-            "C1259976861-ASF",
-            "C1258354201-ASF",
-            "C1259981910-ASF",
-            "C2795135174-ASF",
-            "C1260721853-ASF",
-            "C1257995186-ASF",
-            "C1259974840-ASF",
-            "C1212200781-ASF",
-            "C1212209075-ASF",
-            "C1257024016-ASF",
-            "C1225776655-ASF",
-            "C1225776657-ASF",
-            "C1225776658-ASF",
-            "C1225776659-ASF",
-            "C1245953394-ASF",
-            "C1234413245-ASFDEV",
-            "C1234413229-ASFDEV",
-            "C1234413237-ASFDEV",
-            "C1234413238-ASFDEV",
-            "C1234413236-ASFDEV",
-            "C1234413230-ASFDEV",
-            "C1234413232-ASFDEV",
-            "C1234413235-ASFDEV",
-            "C1234413240-ASFDEV",
-            "C1234413234-ASFDEV",
-            "C1234413241-ASFDEV",
-            "C1234413233-ASFDEV",
-            "C1234413243-ASFDEV",
-            "C1234413244-ASFDEV",
-            "C1244552887-ASFDEV",
-            "C1234413228-ASFDEV",
-            "C1234413231-ASFDEV",
-            "C1234413239-ASFDEV",
-            "C1234413242-ASFDEV",
-            "C1257175154-ASFDEV",
-            "C1244598379-ASFDEV",
-            "C1240784657-ASFDEV",
-            "C1327985661-ASF", # S1B
-            "C1327985645-ASF",
-            "C1595422627-ASF",
-            "C1327985617-ASF",
-            "C1327985660-ASF",
-            "C1327985741-ASF",
-            "C1327985578-ASF",
-            "C1327985646-ASF",
-            "C1327985650-ASF",
-            "C1327985579-ASF",
-            "C1327985740-ASF",
-            "C1327985619-ASF",
-            "C1327985739-ASF",
-            "C1327985647-ASF",
-            "C2777443834-ASF",
-            "C2777436413-ASF",
-            "C1327985697-ASF",
-            "C1327985651-ASF",
-            "C1327985644-ASF",
-            "C1327985571-ASF",
-            "C1327985674-ASF",
-            "C2709161906-ASF",
-            "C1596065640-ASF",
-            "C1596065639-ASF",
-            "C1596065641-ASF",
-            "C1595765183-ASF",
-            "C2450786986-ASF",
-            "C1216244348-ASF",
-            "C1216244589-ASF",
-            "C1216244594-ASF",
-            "C1216244593-ASF",
-            "C1216244585-ASF",
-            "C1216244592-ASF",
-            "C1216244595-ASF",
-            "C1225776654-ASF",
-            "C1216244590-ASF",
-            "C1216244601-ASF",
-            "C1216244600-ASF",
-            "C1216244591-ASF",
-            "C1216244587-ASF",
-            "C1216244598-ASF",
-            "C1216244586-ASF",
-            "C1260726384-ASF",
-            "C1258354200-ASF",
-            "C1259982010-ASF",
-            "C2795135668-ASF",
-            "C1260721945-ASF",
-            "C1257995185-ASF",
-            "C1259976861-ASF",
-            "C1258354201-ASF",
-            "C1259981910-ASF",
-            "C2795135174-ASF",
-            "C1260721853-ASF",
-            "C1257995186-ASF",
-            "C1259974840-ASF",
-            "C1216244597-ASF",
-            "C1216244596-ASF",
-            "C1216244588-ASF",
-            "C1216244599-ASF",
-            "C1257024016-ASF",
-            "C1225776655-ASF",
-            "C1225776657-ASF",
-            "C1225776658-ASF",
-            "C1225776659-ASF",
-            "C1245953394-ASF",
-            "C1234413263-ASFDEV",
-            "C1234413247-ASFDEV",
-            "C1234413248-ASFDEV",
-            "C1234413255-ASFDEV",
-            "C1234413254-ASFDEV",
-            "C1234413256-ASFDEV",
-            "C1234413253-ASFDEV",
-            "C1234413252-ASFDEV",
-            "C1234413250-ASFDEV",
-            "C1234413259-ASFDEV",
-            "C1234413251-ASFDEV",
-            "C1234413261-ASFDEV",
-            "C1234413262-ASFDEV",
-            "C1234413258-ASFDEV",
-            "C1244552887-ASFDEV",
-            "C1234413246-ASFDEV",
-            "C1234413249-ASFDEV",
-            "C1234413257-ASFDEV",
-            "C1234413260-ASFDEV",
-            "C1257175154-ASFDEV",
-            "C1244598379-ASFDEV",
-          ]
-        }]
+      expected: [{ processingLevel: UNKNOWN_PROCESSING_TYPE, collections: [
+                "C1214353986-ASF",
+                "C1214336045-ASF",
+                "C1261881077-ASF",
+                "C2859376221-ASF",
+                "C1214336717-ASF",
+                "C1214335430-ASF",
+                "C1214335471-ASF",
+                "C1214335903-ASF",
+                "C1214336154-ASF",
+                "C1214336554-ASF",
+                "C1214353593-ASF",
+                "C1214353754-ASF",
+                "C1214353859-ASF",
+                "C1214337770-ASF",
+                "C1214354144-ASF",
+                "C1214354235-ASF",
+                "C1214343609-ASF",
+                "C1214354031-ASF",
+                "C1214408428-ASF",
+                "C1214419355-ASF",
+                "C1210487703-ASF",
+                "C1212030772-ASF",
+                "C1206116665-ASF",
+                "C1206132445-ASF",
+                "C1211962154-ASF",
+                "C1212001698-ASF",
+                "C1212005594-ASF",
+                "C1212019993-ASF",
+                "C1207638502-ASF",
+                "C1210025872-ASF",
+                "C1210485039-ASF",
+                "C1207188317-ASF",
+                "C1210546638-ASF",
+                "C1206122195-ASF",
+                "C1209970710-ASF",
+                "C1207038647-ASF",
+                "C1210599503-ASF",
+                "C1210599673-ASF",
+                "C1214470488-ASF",
+                "C1205428742-ASF",
+                "C1234413245-ASFDEV",
+                "C1327985661-ASF",
+                "C1216244348-ASF",
+                "C1234413263-ASFDEV",
+                "C2803501758-ASF", # OPERA
+                "C2803501097-ASF", # OPERA
+                "C1214470488-ASF", # S1A
+                "C1214470533-ASF",
+                "C1214470576-ASF",
+                "C1595422627-ASF",
+                "C1214470496-ASF",
+                "C1214470532-ASF",
+                "C1214472977-ASF",
+                "C1214472336-ASF",
+                "C1266376001-ASF",
+                "C1214472994-ASF",
+                "C1214470732-ASF",
+                "C1214473170-ASF",
+                "C1214470561-ASF",
+                "C1214471521-ASF",
+                "C1214470682-ASF",
+                "C2777443834-ASF",
+                "C2777436413-ASF",
+                "C1214471197-ASF",
+                "C1214471960-ASF",
+                "C1214472978-ASF",
+                "C1214473165-ASF",
+                "C2709161906-ASF",
+                "C1596065640-ASF",
+                "C1596065639-ASF",
+                "C1596065641-ASF",
+                "C1595765183-ASF",
+                "C2450786986-ASF",
+                "C1205428742-ASF",
+                "C1212201032-ASF",
+                "C1212212560-ASF",
+                "C1205264459-ASF",
+                "C1208117434-ASF",
+                "C1212209035-ASF",
+                "C1212209226-ASF",
+                "C1208115009-ASF",
+                "C1212158327-ASF",
+                "C1215704763-ASF",
+                "C1225776654-ASF",
+                "C1212158318-ASF",
+                "C1212212493-ASF",
+                "C1212158326-ASF",
+                "C1212233976-ASF",
+                "C1260726384-ASF",
+                "C1258354200-ASF",
+                "C1259982010-ASF",
+                "C2795135668-ASF",
+                "C1260721945-ASF",
+                "C1257995185-ASF",
+                "C1259976861-ASF",
+                "C1258354201-ASF",
+                "C1259981910-ASF",
+                "C2795135174-ASF",
+                "C1260721853-ASF",
+                "C1257995186-ASF",
+                "C1259974840-ASF",
+                "C1212200781-ASF",
+                "C1212209075-ASF",
+                "C1257024016-ASF",
+                "C1225776655-ASF",
+                "C1225776657-ASF",
+                "C1225776658-ASF",
+                "C1225776659-ASF",
+                "C1245953394-ASF",
+                "C1234413245-ASFDEV",
+                "C1234413229-ASFDEV",
+                "C1234413237-ASFDEV",
+                "C1234413238-ASFDEV",
+                "C1234413236-ASFDEV",
+                "C1234413230-ASFDEV",
+                "C1234413232-ASFDEV",
+                "C1234413235-ASFDEV",
+                "C1234413240-ASFDEV",
+                "C1234413234-ASFDEV",
+                "C1234413241-ASFDEV",
+                "C1234413233-ASFDEV",
+                "C1234413243-ASFDEV",
+                "C1234413244-ASFDEV",
+                "C1244552887-ASFDEV",
+                "C1234413228-ASFDEV",
+                "C1234413231-ASFDEV",
+                "C1234413239-ASFDEV",
+                "C1234413242-ASFDEV",
+                "C1257175154-ASFDEV",
+                "C1244598379-ASFDEV",
+                "C1240784657-ASFDEV",
+                "C1327985661-ASF", # S1B
+                "C1327985645-ASF",
+                "C1595422627-ASF",
+                "C1327985617-ASF",
+                "C1327985660-ASF",
+                "C1327985741-ASF",
+                "C1327985578-ASF",
+                "C1327985646-ASF",
+                "C1327985650-ASF",
+                "C1327985579-ASF",
+                "C1327985740-ASF",
+                "C1327985619-ASF",
+                "C1327985739-ASF",
+                "C1327985647-ASF",
+                "C2777443834-ASF",
+                "C2777436413-ASF",
+                "C1327985697-ASF",
+                "C1327985651-ASF",
+                "C1327985644-ASF",
+                "C1327985571-ASF",
+                "C1327985674-ASF",
+                "C2709161906-ASF",
+                "C1596065640-ASF",
+                "C1596065639-ASF",
+                "C1596065641-ASF",
+                "C1595765183-ASF",
+                "C2450786986-ASF",
+                "C1216244348-ASF",
+                "C1216244589-ASF",
+                "C1216244594-ASF",
+                "C1216244593-ASF",
+                "C1216244585-ASF",
+                "C1216244592-ASF",
+                "C1216244595-ASF",
+                "C1225776654-ASF",
+                "C1216244590-ASF",
+                "C1216244601-ASF",
+                "C1216244600-ASF",
+                "C1216244591-ASF",
+                "C1216244587-ASF",
+                "C1216244598-ASF",
+                "C1216244586-ASF",
+                "C1260726384-ASF",
+                "C1258354200-ASF",
+                "C1259982010-ASF",
+                "C2795135668-ASF",
+                "C1260721945-ASF",
+                "C1257995185-ASF",
+                "C1259976861-ASF",
+                "C1258354201-ASF",
+                "C1259981910-ASF",
+                "C2795135174-ASF",
+                "C1260721853-ASF",
+                "C1257995186-ASF",
+                "C1259974840-ASF",
+                "C1216244597-ASF",
+                "C1216244596-ASF",
+                "C1216244588-ASF",
+                "C1216244599-ASF",
+                "C1257024016-ASF",
+                "C1225776655-ASF",
+                "C1225776657-ASF",
+                "C1225776658-ASF",
+                "C1225776659-ASF",
+                "C1245953394-ASF",
+                "C1234413263-ASFDEV",
+                "C1234413247-ASFDEV",
+                "C1234413248-ASFDEV",
+                "C1234413255-ASFDEV",
+                "C1234413254-ASFDEV",
+                "C1234413256-ASFDEV",
+                "C1234413253-ASFDEV",
+                "C1234413252-ASFDEV",
+                "C1234413250-ASFDEV",
+                "C1234413259-ASFDEV",
+                "C1234413251-ASFDEV",
+                "C1234413261-ASFDEV",
+                "C1234413262-ASFDEV",
+                "C1234413258-ASFDEV",
+                "C1244552887-ASFDEV",
+                "C1234413246-ASFDEV",
+                "C1234413249-ASFDEV",
+                "C1234413257-ASFDEV",
+                "C1234413260-ASFDEV",
+                "C1257175154-ASFDEV",
+                "C1244598379-ASFDEV",
+              ] }]
 
   - test-search-build_subquery shortName:
       params:
-        shortName: 'newShortName'
+        shortName: "newShortName"
+      expected:
+        - shortName: ["newShortName"]
+
+  - test-search-build_subquery granule_list wildcard with maxResults:
+      params:
+        granule_list: "NISAR_L2_PR_GSLC_*"
+        maxResults: 250
       expected:
-        - shortName: ['newShortName']
+        - granule_list: ["NISAR_L2_PR_GSLC_*"]
+        - maxResults: 250
 
   - test-search-build_subquery shortName multiple:
       params:
-        shortName: ['newShortName', 'oldShortName']
+        shortName: ["newShortName", "oldShortName"]
       expected:
-        - shortName: ['newShortName', 'oldShortName']
+        - shortName: ["newShortName", "oldShortName"]
 
   - test-search-build_subquery cmr_keywords:
       params:
-        cmr_keywords: ['attribute[]', 'unique_value']
+        cmr_keywords: ["attribute[]", "unique_value"]
       expected:
-        - cmr_keywords: [['attribute[]', 'unique_value']]
+        - cmr_keywords: [["attribute[]", "unique_value"]]
   - test-search-build_subquery multiple cmr_keywords:
       params:
-        cmr_keywords: [['attribute[]', 'unique_value'],['special_key', 'special_value']]
+        cmr_keywords:
+          [["attribute[]", "unique_value"], ["special_key", "special_value"]]
       expected:
-        - cmr_keywords: [['attribute[]', 'unique_value'],['special_key', 'special_value']]
+        - cmr_keywords:
+            [["attribute[]", "unique_value"], ["special_key", "special_value"]]
 
   - test-search-build_subquery configuration params:
       params:
-        host: 'cmr.uat.earthdata.nasa.gov'
-        provider: 'ASFDEV'
-        product_list: ['S1_069649_IW1_20151201T232154_VV_73D6-BURST']
-      expected: [
-        {
-          host: 'cmr.uat.earthdata.nasa.gov',
-          provider: 'ASFDEV',
-          product_list: ['S1_069649_IW1_20151201T232154_VV_73D6-BURST']
-        }
-      ]
+        host: "cmr.uat.earthdata.nasa.gov"
+        provider: "ASFDEV"
+        product_list: ["S1_069649_IW1_20151201T232154_VV_73D6-BURST"]
+      expected:
+        [
+          {
+            host: "cmr.uat.earthdata.nasa.gov",
+            provider: "ASFDEV",
+            product_list: ["S1_069649_IW1_20151201T232154_VV_73D6-BURST"],
+          },
+        ]
 
   - test-aliasing-search-against-api SLC:
       params:
         processingLevel: SLC
-        start: '2023-12-01T00:00:00Z'
-        end: '2023-12-31T00:00:00Z'
+        start: "2023-12-01T00:00:00Z"
+        end: "2023-12-31T00:00:00Z"
 
   - test-aliasing-search-against-api S1A SLC:
       params:
         platform: SENTINEL-1A
         processingLevel: SLC
-        start: '2023-12-01T00:00:00Z'
-        end: '2023-12-31T00:00:00Z'
+        start: "2023-12-01T00:00:00Z"
+        end: "2023-12-31T00:00:00Z"
 
   - test-aliasing-search-against-api S1A RTC:
       params:
         platform: SENTINEL-1A
         processingLevel: RTC
-        start: '2023-12-01T00:00:00Z'
-        end: '2023-12-31T00:00:00Z'
+        start: "2023-12-01T00:00:00Z"
+        end: "2023-12-31T00:00:00Z"
 
   - test-aliasing-search-against-api S1A CSLC:
       params:
         platform: SENTINEL-1A
         processingLevel: CSLC
-        start: '2023-12-01T00:00:00Z'
-        end: '2023-12-31T00:00:00Z'
+        start: "2023-12-01T00:00:00Z"
+        end: "2023-12-31T00:00:00Z"
 
   - test-ASFSearch-search-error 400-Error circle radius too small:
       parameters:
-          circle: [0, 0, 2]
+        circle: [0, 0, 2]
       status_code: 400
       report: "Circle radius must be between 10 and 6000000, but was 2.0"
 
@@ -901,7 +895,7 @@ tests:
       params:
         platform: SIRC
         processingLevel: SLC
-    
+
   - test-aliasing-search-against-api ALOS:
       params:
         platform: ALOS
@@ -950,7 +944,7 @@ tests:
       params:
         platform: RADARSAT
         processingLevel: L0
-    
+
   - test-aliasing-search-against-api AIRSAR:
       params:
         platform: AIRSAR
@@ -972,7 +966,7 @@ tests:
       params:
         platform: SMAP
         processingLevel: L1A_RADAR_RO_HDF5
-    
+
   - test-aliasing-search-against-api UAVSAR:
       params:
         platform: UAVSAR
@@ -981,3 +975,124 @@ tests:
       params:
         platform: UAVSAR
         processingLevel: AMPLITUDE
+
+  - test-granule-search-patterns basic case NISAR L2 Cycle 10 Relative Orbit 16:
+      params:
+        granule_list: ["NISAR_L2_PR_*_010_16*"]
+        maxResults: 250
+      output:
+        expected_properties:
+          processingLevel: ["GSLC", "GCOV", "GUNW", "GOFF"]
+          productionConfiguration: "PR"
+          pathNumber: [[160, 169]]
+        expect_results: True
+
+  - test-granule-search-patterns basic case NISAR L2 Cycle 10 Relative Orbit 16 DHDH:
+      params:
+        granule_list: ["NISAR_L2_PR_*_010_16*_DHDH_*_001"]
+        maxResults: 250
+      output:
+        expected_properties:
+          processingLevel: ["GSLC", "GCOV", "GUNW", "GOFF"]
+          productionConfiguration: "PR"
+          pathNumber: [[160, 169]]
+          mainBandPolarization: [HH, HV]
+          sideBandPolarization: [HH, HV]
+        expect_results: True
+
+  - test-granule-search-patterns basic case NISAR L1+L2 no mainBandPolarization:
+      params:
+        maxResults: 250
+        flightDirection: "ASCENDING"
+        processingLevel: ["GSLC", "GCOV", "RSLC"]
+        relativeOrbit: [[40, 42]]
+        dataset: ["NISAR"]
+        frameCoverage: "Partial"
+        productionConfiguration: ["PR"]
+        granule_list: ["NISAR_L*_PR_*_NA*"]
+      output:
+        expected_properties:
+          processingLevel: ["GSLC", "GCOV", "RSLC"]
+          productionConfiguration: "PR"
+          pathNumber: [[40, 42]]
+          mainBandPolarization: null
+          flightDirection: ASCENDING
+        expect_results: True
+
+  - test-granule-search-patterns basic case NISAR ? overlapping filters:
+      params:
+        maxResults: 250
+        flightDirection: "ASCENDING"
+        granule_list: ["NISAR_L?_PR_*"]
+      output:
+        expect_results: True
+        expected_properties:
+          flightDirection: ASCENDING
+          processingLevel: ["SME2", "GSLC", "GCOV", "GOFF", "GUNW", "RSLC", "RUNW", "ROFF", "RIFG", "RRSD"]
+
+  - test-granule-search-patterns basic case NISAR wildcard zero overlapping filters:
+      params:
+        maxResults: 250
+        flightDirection: "ASCENDING"
+        processingLevel: ["GSLC", "GCOV", "RSLC"]
+        granule_list: ["NISAR_L3_PR_*_NA*"]
+      output:
+        expect_results: False
+
+  - test-granule-search-patterns basic case NISAR wildcard + ? overlapping filters:
+      params:
+        maxResults: 250
+        flightDirection: "ASCENDING"
+        processingLevel: ["GSLC", "GCOV", "RSLC"]
+        granule_list: ["NISAR_L?_PR_*_NA*"]
+      output:
+        expect_results: True
+        expected_properties:
+          processingLevel: ["GSLC", "GCOV", "RSLC"]
+          productionConfiguration: "PR"
+          mainBandPolarization: null
+          flightDirection: ASCENDING
+
+  - test-granule-search-patterns NISAR crid filter L2 X0500?:
+      params:
+        maxResults: 250
+        dataset: NISAR
+        granule_list: ["NISAR_L2_PR_*X0500?*"]
+      output:
+        expect_results: True
+        expected_properties:
+          processingLevel: ["GSLC", "GCOV", "GUNW", "GOFF"]
+          productionConfiguration: "PR"
+          crid: ['X05000', 'X05001','X05002','X05003','X05004','X05005','X05006','X05007','X05008', 'X05009']
+
+  - test-granule-search-patterns NISAR crid filter X05005:
+      params:
+        maxResults: 250
+        dataset: NISAR
+        granule_list: ["NISAR_L?_PR_*X05005*"]
+      output:
+        expect_results: True
+        expected_properties:
+          processingLevel: ["SME2", "GSLC", "GCOV", "GOFF", "GUNW", "RSLC", "RUNW", "ROFF", "RIFG", "RRSD"]
+          productionConfiguration: "PR"
+          crid: X05005
+
+  - test-granule-search-patterns NISAR RUNW crid filter X05010:
+      params:
+        maxResults: 250
+        dataset: NISAR
+        granule_list: ["NISAR_L1_PR_RUNW*X05010*"]
+      output:
+        expect_results: True
+        expected_properties:
+          processingLevel: RUNW
+          productionConfiguration: "PR"
+          crid: X05010
+
+  - test-granule-search-patterns NISAR RUNW bad crid filter:
+      params:
+        maxResults: 250
+        dataset: NISAR
+        granule_list: ["NISAR_L1_PR_RUNW*Y05010*"]
+      output:
+        expect_results: False



View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/compare/b1ca093e44023f4fea055f5b909b5fbf80759076...51cb2698b61a965fff616c68282478dc8fc67464

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/compare/b1ca093e44023f4fea055f5b909b5fbf80759076...51cb2698b61a965fff616c68282478dc8fc67464
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260414/f3ae293d/attachment-0001.htm>


More information about the Pkg-grass-devel mailing list