def test_prepare_le07_l2_c2(
    tmp_path: Path,
    le07_l2_c2_folder: Path,
):
    """Support a functionality baseline for the enhancements to expand landsat
    prepare (YAML) logic to support USGS level 2 - PR#159:
     LE07 C2 L2."""
    assert le07_l2_c2_folder.exists(), "Test data missing(?)"

    output_path = tmp_path
    expected_metadata_path = (
        output_path / "090" / "084" /
        "LE07_L2SP_090084_20210331_20210426_02_T1.odc-metadata.yaml")
    check_prepare_outputs(
        invoke_script=landsat_l1_prepare.main,
        run_args=[
            "--output-base",
            output_path,
            "--producer",
            "usgs.gov",
            le07_l2_c2_folder,
        ],
        expected_doc=expected_le07_l2_c2_folder(),
        expected_metadata_path=expected_metadata_path,
    )
def test_prepare_l8_l1_tarball_with_source(tmp_path: Path, l1_ls8_folder: Path,
                                           ls8_telemetry_path,
                                           l1_ls8_ga_expected: Dict):
    """Run prepare script with a source telemetry data and unique producer."""
    assert l1_ls8_folder.exists(), "Test data missing(?)"

    output_path = tmp_path
    expected_metadata_path = (
        output_path / "090" / "084" /
        "LC08_L1TP_090084_20160121_20170405_01_T1.odc-metadata.yaml")

    check_prepare_outputs(
        invoke_script=landsat_l1_prepare.main,
        run_args=[
            "--output-base",
            output_path,
            "--producer",
            "ga.gov.au",
            "--source",
            ls8_telemetry_path,
            l1_ls8_folder,
        ],
        expected_doc=l1_ls8_ga_expected,
        expected_metadata_path=expected_metadata_path,
    )
Esempio n. 3
0
def test_prepare_l7_l1_usgs_tarball(l1_ls7_tarball: Path,
                                    l1_ls7_tarball_md_expected: Dict):
    assert l1_ls7_tarball.exists(), "Test data missing(?)"

    expected_metadata_path = (
        l1_ls7_tarball.parent /
        "LE07_L1TP_104078_20130429_20161124_01_T1.odc-metadata.yaml")

    check_prepare_outputs(
        invoke_script=landsat_l1_prepare.main,
        run_args=[str(l1_ls7_tarball)],
        expected_doc=l1_ls7_tarball_md_expected,
        expected_metadata_path=expected_metadata_path,
    )
Esempio n. 4
0
def test_prepare_l8_l1_usgs_tarball(l1_ls8_folder, l1_ls8_folder_md_expected):
    assert l1_ls8_folder.exists(), "Test data missing(?)"

    # No output path defined,so it will default to being a sibling to the input.
    expected_metadata_path = (
        l1_ls8_folder.parent /
        "LC08_L1TP_090084_20160121_20170405_01_T1.odc-metadata.yaml")
    assert not expected_metadata_path.exists()

    check_prepare_outputs(
        invoke_script=landsat_l1_prepare.main,
        run_args=[str(l1_ls8_folder)],
        expected_doc=l1_ls8_folder_md_expected,
        expected_metadata_path=expected_metadata_path,
    )
Esempio n. 5
0
def test_run(tmp_path, expected_dataset_document):
    """
    Run prepare on our test input scene, and check the created metadata matches expected.
    """
    shutil.copy(DATASET_PATH, tmp_path)
    expected_metadata_path = tmp_path / (
        "S2B_MSIL1C_20201011T000249_N0209_R030_T55HFA_20201011T011446.odc-metadata.yaml"
    )
    check_prepare_outputs(
        invoke_script=sentinel_l1_prepare.main,
        run_args=[
            tmp_path / DATASET_PATH.name,
        ],
        expected_doc=expected_dataset_document,
        expected_metadata_path=expected_metadata_path,
    )
def test_sinergise_sentinel_l1(tmp_path, expected_dataset_document):
    """
    Run prepare on our test dataset, and check the out metadata doc matches.
    """
    work_dir = tmp_path / DATASET_DIR.name
    shutil.copytree(DATASET_DIR, work_dir)

    output_yaml_path = (
        work_dir /
        "S2B_MSIL1C_20201011T000249_N0209_R030_T55HFA_20201011T011446.odc-metadata.yaml"
    )
    check_prepare_outputs(
        invoke_script=sentinel_l1_prepare.main,
        run_args=[
            work_dir,
        ],
        expected_doc=expected_dataset_document,
        expected_metadata_path=output_yaml_path,
    )
Esempio n. 7
0
def test_generate_expected_outputs(
    tmp_path: Path, dataset_input_output: Tuple[Path, Dict, Path]
):
    """
    Run prepare on our test input scenes, and check the created metadata matches expected.
    """
    (
        input_dataset_path,
        expected_metadata_doc,
        expected_metadata_path,
    ) = dataset_input_output
    check_prepare_outputs(
        invoke_script=sentinel_l1_prepare.main,
        run_args=[
            input_dataset_path,
        ],
        expected_doc=expected_metadata_doc,
        expected_metadata_path=expected_metadata_path,
    )
Esempio n. 8
0
def test_prepare_l5_l1_usgs_tarball(tmp_path: Path,
                                    l1_ls5_tarball_md_expected: Dict,
                                    l1_ls5_tarball: Path):
    assert l1_ls5_tarball.exists(), "Test data missing(?)"
    output_path: Path = tmp_path / "out"
    output_path.mkdir()

    # When specifying an output base path it will create path/row subfolders within it.
    expected_metadata_path = (
        output_path / "090" / "085" /
        "LT05_L1TP_090085_19970406_20161231_01_T1.odc-metadata.yaml")

    check_prepare_outputs(
        invoke_script=landsat_l1_prepare.main,
        run_args=["--output-base",
                  str(output_path),
                  str(l1_ls5_tarball)],
        expected_doc=l1_ls5_tarball_md_expected,
        expected_metadata_path=expected_metadata_path,
    )
def test_prepare_l9_l1_c2(tmp_path: Path, l1_ls9_tarball: Path,
                          l9_expected: Dict):
    """Run prepare script with a source telemetry data and unique producer."""
    assert l1_ls9_tarball.exists(), "Test data missing(?)"

    output_path = tmp_path
    check_prepare_outputs(
        invoke_script=landsat_l1_prepare.main,
        run_args=[
            "--output-base",
            output_path,
            "--producer",
            "usgs.gov",
            l1_ls9_tarball,
        ],
        expected_doc=l9_expected,
        expected_metadata_path=(
            output_path / "112" / "081" /
            "LC09_L1TP_112081_20220209_20220209_02_T1.odc-metadata.yaml"),
    )
def test_prepare_s2a_l1c_safe(tmpdir):
    assert L1_ZIPFILE_PATH.exists(), "Test data missing(?)"

    output_path = Path(tmpdir)

    # make a folder and extract contents
    output_path.mkdir(parents=True, exist_ok=True)
    with zipfile.ZipFile(L1_ZIPFILE_PATH, "r") as zipped_data:
        zipped_data.extractall(output_path)

    expected_metadata_path = (
        output_path /
        "S2B_OPER_MSI_L1C_TL_EPAE_20180617T013729_A006677_T55JGF_N02.06.yaml")

    def path_offset(offset: str):
        return "s3://sentinel-s2-l1c/tiles/55/J/GF/2018/6/17/0/" + offset

    expected_doc = {
        "acquisition": {
            "groundstation": {
                "code": "EPA_"
            }
        },
        "archiving_time":
        "2018-06-17T02:06:21.973943Z",
        "creation_dt":
        "2018-06-17T01:27:55Z",
        "checksum_sha1":
        "bfac5eea3ec0c6c70816ddb97592dfd4d8a389e2",
        "datastrip_id":
        "S2B_OPER_MSI_L1C_DS_EPAE_20180617T013729_S20180617T001107_N02.06",
        "datastrip_metadata":
        ("http://sentinel-s2-l1c.s3-website.eu-central-1.amazonaws.com"
         "/#products/2018/6/17/S2B_MSIL1C_20180617T001109_N0206_R073_"
         "T55JGF_20180617T013729/datastrip/0"),
        "datatake_id": {
            "datatakeIdentifier": "GS2B_20180617T001109_006677_N02.06",
            "metadataLevel": "Brief",
        },
        "datatake_sensing_start":
        "2018-06-17T00:11:09.024Z",
        "datatake_type":
        "INS-NOBS",
        "downlink_priority":
        "NOMINAL",
        "extent": {
            "center_dt": "2018-06-17T00:11:07.458Z",
            "coord": {
                "ll": {
                    "lat": -31.705779763545088,
                    "lon": 149.11005323208184
                },
                "lr": {
                    "lat": -31.681364358256744,
                    "lon": 150.26738162306842
                },
                "ul": {
                    "lat": -30.715729325189965,
                    "lon": 149.08817422152293
                },
                "ur": {
                    "lat": -30.6922425616759,
                    "lon": 150.23354450086148
                },
            },
        },
        "format": {
            "name": "JPEG2000"
        },
        "grid_spatial": {
            "projection": {
                "geo_ref_points": {
                    "ll": {
                        "x": 699960,
                        "y": 6490240
                    },
                    "lr": {
                        "x": 809760,
                        "y": 6490240
                    },
                    "ul": {
                        "x": 699960,
                        "y": 6600040
                    },
                    "ur": {
                        "x": 809760,
                        "y": 6600040
                    },
                },
                "spatial_reference": "EPSG:32755",
                "valid_data": {
                    "coordinates": [[
                        [781030.5157393045, 6490240.0],
                        [802194.5431029584, 6568088.898470836],
                        [807815.3469119765, 6599599.456501017],
                        [807233.663302242, 6600040.0],
                        [699960.0, 6600040.0],
                        [699960.0, 6490240.0],
                        [781030.5157393045, 6490240.0],
                    ]],
                    "type":
                    "Polygon",
                },
            }
        },
        "id":
        "e6e14ee5-c431-559d-8b07-e387648d06c6",
        "image": {
            "bands": {
                "B01": {
                    "layer": 1,
                    "path": path_offset("B01.jp2")
                },
                "B02": {
                    "layer": 1,
                    "path": path_offset("B02.jp2")
                },
                "B03": {
                    "layer": 1,
                    "path": path_offset("B03.jp2")
                },
                "B04": {
                    "layer": 1,
                    "path": path_offset("B04.jp2")
                },
                "B05": {
                    "layer": 1,
                    "path": path_offset("B05.jp2")
                },
                "B06": {
                    "layer": 1,
                    "path": path_offset("B06.jp2")
                },
                "B07": {
                    "layer": 1,
                    "path": path_offset("B07.jp2")
                },
                "B08": {
                    "layer": 1,
                    "path": path_offset("B08.jp2")
                },
                "B09": {
                    "layer": 1,
                    "path": path_offset("B09.jp2")
                },
                "B10": {
                    "layer": 1,
                    "path": path_offset("B10.jp2")
                },
                "B11": {
                    "layer": 1,
                    "path": path_offset("B11.jp2")
                },
                "B12": {
                    "layer": 1,
                    "path": path_offset("B12.jp2")
                },
                "B8A": {
                    "layer": 1,
                    "path": path_offset("B8A.jp2")
                },
            },
            "cloud_cover_percentage":
            41.1953,
            "degraded_anc_data_percentage":
            0.0,
            "degraded_msi_data_percentage":
            0.0,
            "format_quality_flag":
            "PASSED",
            "general_quality_flag":
            "PASSED",
            "geometric_quality_flag":
            "PASSED",
            "radiometric_quality_flag":
            "PASSED",
            "reflectance_conversion":
            "0.969545500936321",
            "sensor_quality_flag":
            "PASSED",
            "solar_irradiance": [],
            "sun_azimuth":
            28.329529500752,
            "sun_elevation":
            60.25415978281,
            "tile_reference":
            "N02.06",
            "viewing_angles": [
                {
                    "bandId": "0",
                    "measurement": {
                        "azimuth": {
                            "value": 285.033757307864
                        },
                        "zenith": {
                            "value": 8.48756458553399
                        },
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "9",
                    "measurement": {
                        "azimuth": {
                            "value": 285.075607281345
                        },
                        "zenith": {
                            "value": 8.52241368394389
                        },
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "10",
                    "measurement": {
                        "azimuth": {
                            "value": 284.793804242023
                        },
                        "zenith": {
                            "value": 8.34345092249542
                        },
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "1",
                    "measurement": {
                        "azimuth": {
                            "value": 284.793733737481
                        },
                        "zenith": {
                            "value": 8.29509641932038
                        },
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "2",
                    "measurement": {
                        "azimuth": {
                            "value": 284.851677995258
                        },
                        "zenith": {
                            "value": 8.32126064250559
                        },
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "3",
                    "measurement": {
                        "azimuth": {
                            "value": 284.909295311577
                        },
                        "zenith": {
                            "value": 8.3544279324201
                        },
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "4",
                    "measurement": {
                        "azimuth": {
                            "value": 284.933467772596
                        },
                        "zenith": {
                            "value": 8.37600138776781
                        },
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "5",
                    "measurement": {
                        "azimuth": {
                            "value": 284.973394067973
                        },
                        "zenith": {
                            "value": 8.40018017679447
                        },
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "6",
                    "measurement": {
                        "azimuth": {
                            "value": 285.002316322296
                        },
                        "zenith": {
                            "value": 8.42684047592471
                        },
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "7",
                    "measurement": {
                        "azimuth": {
                            "value": 284.82134822338
                        },
                        "zenith": {
                            "value": 8.30688902336585
                        },
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "8",
                    "measurement": {
                        "azimuth": {
                            "value": 285.068419119347
                        },
                        "zenith": {
                            "value": 8.45522377449714
                        },
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "11",
                    "measurement": {
                        "azimuth": {
                            "value": 284.889987613982
                        },
                        "zenith": {
                            "value": 8.39599518380445
                        },
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "12",
                    "measurement": {
                        "azimuth": {
                            "value": 284.999750610317
                        },
                        "zenith": {
                            "value": 8.46178406516545
                        },
                    },
                    "unit": "degree",
                },
            ],
        },
        "instrument": {
            "name": "MSI"
        },
        "lineage": {
            "source_datasets": {}
        },
        "orbit":
        "73",
        "orbit_direction":
        "DESCENDING",
        "platform": {
            "code": "SENTINEL_2B"
        },
        "processing_level":
        "Level-1C",
        "product_format": {
            "name": "s2_aws_pds"
        },
        "product_type":
        "level1",
        "size_bytes":
        1292575,
        "tile_id":
        "S2B_OPER_MSI_L1C_TL_EPAE_20180617T013729_A006677_T55JGF_N02.06",
    }

    check_prepare_outputs(
        invoke_script=s2_l1c_aws_pds_prepare.main,
        run_args=[
            "--output",
            str(output_path),
            str(output_path /
                "S2B_OPER_MSI_L1C_TL_EPAE_20180617T013729_A006677_T55JGF_N02.06"
                ),
        ],
        expected_doc=expected_doc,
        expected_metadata_path=expected_metadata_path,
    )
Esempio n. 11
0
def test_filter_folder_structure_info(
    tmp_path: Path, dataset_input_output: Tuple[Path, Dict, Path]
):
    (
        input_dataset_path,
        expected_metadata_doc,
        expected_metadata_path,
    ) = dataset_input_output

    metadata_offset = expected_metadata_path.relative_to(input_dataset_path.parent)

    input_folder = tmp_path / "inputs"

    subfolders = "2019/2019-01/25S125E-30S130"

    # Move input data into subfolder hierarchy.
    dataset_folder = input_folder / "L1C" / subfolders
    dataset_folder.mkdir(parents=True)
    new_input_dataset_path = dataset_folder / input_dataset_path.name
    input_dataset_path.rename(new_input_dataset_path)
    input_dataset_path = new_input_dataset_path

    # Expect metadata files to be stored in an identical hierarchy in a different output folder
    output_folder = tmp_path / "output"
    output_folder.mkdir(parents=True)
    expected_metadata_path = output_folder / subfolders / metadata_offset

    # Our output metadata is in a different place than the data, so we expect it to
    # embed the true location in the metadata (by default)
    if input_dataset_path.is_dir():
        expected_metadata_doc[
            "location"
        ] = f"file://{input_dataset_path.as_posix()}/tileInfo.json"
    else:
        expected_metadata_doc["location"] = f"zip:{input_dataset_path}!/"

    # A file with the correct region
    regions_file = tmp_path / "our-regions.txt"
    regions_file.write_text("\n".join(["55HFA", "55HFB"]))
    # A file that doesn't have our region.
    non_regions_file = tmp_path / "our-non-regions.txt"
    non_regions_file.write_text("\n".join(["55HFB", "55HFC"]))

    # Sanity check: no output exists yet.
    assert not expected_metadata_path.exists()

    # Run with filters that skips this dataset:
    # (it should do nothing)

    # Whitelist including the correct region
    res = run_prepare_cli(
        sentinel_l1_prepare.main,
        # It contains our region, so it should filter!
        "--only-regions-in-file",
        regions_file,
        # "Put the output in a different location":
        "--output-base",
        output_folder,
        input_dataset_path,
    )
    assert (
        expected_metadata_path.exists()
    ), f"Expected dataset to be processed (it's within the region file)! {res.output}"
    expected_metadata_path.unlink()

    # Run with a region list that doesn't include our dataset region.
    res = run_prepare_cli(
        sentinel_l1_prepare.main,
        # It contains our region, so it should filter!
        "--only-regions-in-file",
        non_regions_file,
        # "Put the output in a different location":
        "--output-base",
        output_folder,
        input_dataset_path,
    )
    assert (
        not expected_metadata_path.exists()
    ), f"Expected dataset to be filtered out! {res.output}"

    # Filter the time period
    res = run_prepare_cli(
        sentinel_l1_prepare.main,
        # After our time period, so it should filter!
        "--after-month",
        "2019-03",
        # "Put the output in a different location":
        "--output-base",
        output_folder,
        input_dataset_path,
    )
    assert (
        not expected_metadata_path.exists()
    ), f"Expected dataset to be filtered out! {res.output}"

    # Filter the time period
    res = run_prepare_cli(
        sentinel_l1_prepare.main,
        # Before our time period, so it should filter!
        "--before-month",
        "2018-03",
        # "Put the output in a different location":
        "--output-base",
        output_folder,
        input_dataset_path,
    )
    assert (
        not expected_metadata_path.exists()
    ), f"Expected dataset to be filtered out! {res.output}"

    # Now run for real, expect an output.
    check_prepare_outputs(
        invoke_script=sentinel_l1_prepare.main,
        run_args=[
            # Before our time period, so it should be fine!
            "--after-month",
            "2018-12",
            # "Put the output in a different location":
            "--output-base",
            output_folder,
            input_dataset_path,
        ],
        expected_doc=expected_metadata_doc,
        expected_metadata_path=expected_metadata_path,
    )

    # Now run again using a folder input, not an exact zip input.
    # (so it has to scan for datasets)
    shutil.rmtree(output_folder)
    output_folder.mkdir()

    # Now run for real, expect an output.
    check_prepare_outputs(
        invoke_script=sentinel_l1_prepare.main,
        run_args=[
            # "Put the output in a different location":
            "--output-base",
            output_folder,
            # The base folder, so it has to scan for zip files itself!
            input_folder,
        ],
        expected_doc=expected_metadata_doc,
        expected_metadata_path=expected_metadata_path,
    )
def test_prepare_l8_l1_c2(tmp_path: Path, l1_c2_ls8_folder: Path):
    """Run prepare script with a source telemetry data and unique producer."""
    assert l1_c2_ls8_folder.exists(), "Test data missing(?)"

    output_path = tmp_path
    expected_metadata_path = (
        output_path / "089" / "074" /
        "LC08_L1GT_089074_20220506_20220512_02_T2.odc-metadata.yaml")

    expected_doc = {
        "$schema": "https://schemas.opendatacube.org/dataset",
        "id": "5e1359de-0f91-5988-a6f0-8a0a840906f4",
        "label": "usgs_ls8c_level1_2-0-20220512_089074_2022-05-06",
        "product": {
            "name": "usgs_ls8c_level1_2",
            "href":
            "https://collections.dea.ga.gov.au/product/usgs_ls8c_level1_2",
        },
        "crs": "epsg:32656",
        "grids": {
            "default": {
                "shape": [60, 60],
                "transform": [
                    3860.5,
                    0.0,
                    594285.0,
                    0.0,
                    -3910.5,
                    -2121285.0,
                    0.0,
                    0.0,
                    1.0,
                ],
            },
            "panchromatic": {
                "shape": [60, 60],
                "transform": [
                    3860.2500000000005,
                    0.0,
                    594292.5,
                    0.0,
                    -3910.25,
                    -2121292.5,
                    0.0,
                    0.0,
                    1.0,
                ],
            },
        },
        "geometry": {
            "type":
            "Polygon",
            "coordinates": ((
                (635871.100911986, -2328431.8044824763),
                (598807.3537167514, -2315758.4765276713),
                (594285.0, -2314216.125490317),
                (594285.0, -2294479.549612592),
                (629132.1230216483, -2128210.3416854665),
                (634001.1369104853, -2121285.0),
                (671771.6827861228, -2121285.0),
                (759108.8670950294, -2143693.8957929504),
                (819064.1631236447, -2156587.0374096073),
                (824424.9683929395, -2160452.642015061),
                (825915.0, -2160834.95297774),
                (825915.0, -2197333.359107589),
                (818095.1372109791, -2231658.3131009457),
                (784506.5705934291, -2355915.0),
                (764094.013739199, -2355915.0),
                (647454.7800689514, -2332349.7060506954),
                (636125.9731110331, -2328486.0106703877),
                (635871.100911986, -2328431.8044824763),
            ), ),
        },
        "properties": {
            "datetime": "2022-05-06T23:39:59.285133",
            "eo:cloud_cover": 86.35,
            "eo:gsd": 15.0,
            "eo:instrument": "OLI_TIRS",
            "eo:platform": "landsat-8",
            "eo:sun_azimuth": 39.80724521,
            "eo:sun_elevation": 43.24426868,
            "landsat:collection_category": "T2",
            "landsat:collection_number": 2,
            "landsat:data_type": "L1GT",
            "landsat:landsat_product_id":
            "LC08_L1GT_089074_20220506_20220512_02_T2",
            "landsat:landsat_scene_id": "LC80890742022126LGN00",
            "landsat:processing_software_version": "LPGS_15.6.0",
            "landsat:station_id": "LGN",
            "landsat:wrs_path": 89,
            "landsat:wrs_row": 74,
            "odc:dataset_version": "2.0.20220512",
            "odc:file_format": "GeoTIFF",
            "odc:processing_datetime": "2022-05-12T14:00:17",
            "odc:producer": "usgs.gov",
            "odc:product_family": "level1",
            "odc:region_code": "089074",
        },
        "measurements": {
            "blue": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B2.TIF"
            },
            "cirrus": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B9.TIF"
            },
            "coastal_aerosol": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B1.TIF"
            },
            "green": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B3.TIF"
            },
            "lwir_1": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B10.TIF"
            },
            "lwir_2": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B11.TIF"
            },
            "nir": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B5.TIF"
            },
            "panchromatic": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B8.TIF",
                "grid": "panchromatic",
            },
            "qa_radsat": {
                "path":
                "LC08_L1GT_089074_20220506_20220512_02_T2_QA_RADSAT.TIF"
            },
            "quality": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_QA_PIXEL.TIF"
            },
            "red": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B4.TIF"
            },
            "solar_azimuth": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_SAA.TIF"
            },
            "solar_zenith": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_SZA.TIF"
            },
            "swir_1": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B6.TIF"
            },
            "swir_2": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_B7.TIF"
            },
            "view_azimuth": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_VAA.TIF"
            },
            "view_zenith": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_VZA.TIF"
            },
        },
        "accessories": {
            "metadata:landsat_mtl": {
                "path": "LC08_L1GT_089074_20220506_20220512_02_T2_MTL.txt"
            }
        },
        "lineage": {},
    }

    check_prepare_outputs(
        invoke_script=landsat_l1_prepare.main,
        run_args=[
            "--output-base",
            output_path,
            "--producer",
            "usgs.gov",
            l1_c2_ls8_folder,
        ],
        expected_doc=expected_doc,
        expected_metadata_path=expected_metadata_path,
    )
def test_prepare_s2a_l1c_safe(tmpdir):
    assert L1_ZIPFILE_PATH.exists(), "Test data missing(?)"

    output_path = Path(tmpdir)
    expected_metadata_path = (
        output_path
        / "S2A_MSIL1C_20180629T000241_N0206_R030_T56JMM_20180629T012042.zip.yaml"
    )
    granule_path = (
        "/S2A_MSIL1C_20180629T000241_N0206_R030_T56JMM_20180629T012042.SAFE"
        "/GRANULE/L1C_T56JMM_A015757_20180629T000241/"
    )

    def path_offset(offset: str, granule_path=granule_path):
        return "zip://" + str(L1_ZIPFILE_PATH.absolute()) + "!" + granule_path + offset

    expected_doc = {
        "acquisition": {"groundstation": {"code": "EPA_"}},
        "archiving_time": "2018-06-29T03:44:20.252114Z",
        "checksum_sha1": "908571e2cdd54174fb051272be34fe73f6efb9a5",
        "creation_dt": "2018-06-29T01:20:42.000000Z",
        "datastrip_id": "S2A_OPER_MSI_L1C_DS_EPAE_20180629T012042_S20180629T000241_N02.06",
        "datastrip_metadata": (
            "S2A_MSIL1C_20180629T000241_N0206_R030_T56JMM_20180629T012042.SAFE"
            "/DATASTRIP/DS_EPAE_20180629T012042_S20180629T000241/MTD_DS.xml"
        ),
        "datatake_id": {"datatakeIdentifier": "GS2A_20180629T000241_015757_N02.06"},
        "datatake_sensing_start": "2018-06-29T00:02:41.024Z",
        "datatake_type": "INS-NOBS",
        "downlink_priority": "NOMINAL",
        "extent": {
            "center_dt": "2018-06-29T00:02:41.461Z",
            "coord": {
                "ll": {"lat": -30.81709901611161, "lon": 151.95410707081012},
                "lr": {"lat": -30.82128003446065, "lon": 153.10204544208213},
                "ul": {"lat": -29.82640952246035, "lon": 151.9645797990478},
                "ur": {"lat": -29.83042869279505, "lon": 153.10102341983713},
            },
            "from_dt": "2018-06-29T00:02:41.024Z",
            "to_dt": "2018-06-29T00:02:41.024Z",
        },
        "format": {"name": "JPEG2000"},
        "grid_spatial": {
            "projection": {
                "geo_ref_points": {
                    "ll": {"x": 399960, "y": 6590200},
                    "lr": {"x": 509760, "y": 6590200},
                    "ul": {"x": 399960, "y": 6700000},
                    "ur": {"x": 509760, "y": 6700000},
                },
                "spatial_reference": "EPSG:32756",
                "valid_data": {
                    "coordinates": [
                        [
                            [470826.97121060337, 6590200.0],
                            [475130.9086383948, 6598904.030892345],
                            [493180.2237068879, 6681630.058289605],
                            [493214.79452054796, 6700000.0],
                            [399960.0, 6700000.0],
                            [399960.0, 6590200.0],
                            [470826.97121060337, 6590200.0],
                        ]
                    ],
                    "type": "Polygon",
                },
            }
        },
        "id": "d6004c21-171f-5a76-8e4f-2de359af506a",
        "image": {
            "bands": {
                "B01": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B01.jp2"),
                },
                "B02": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B02.jp2"),
                },
                "B03": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B03.jp2"),
                },
                "B04": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B04.jp2"),
                },
                "B05": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B05.jp2"),
                },
                "B06": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B06.jp2"),
                },
                "B07": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B07.jp2"),
                },
                "B08": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B08.jp2"),
                },
                "B09": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B09.jp2"),
                },
                "B10": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B10.jp2"),
                },
                "B11": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B11.jp2"),
                },
                "B12": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B12.jp2"),
                },
                "B8A": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_B8A.jp2"),
                },
                "PVI": {
                    "layer": 1,
                    "path": path_offset("QI_DATA/T56JMM_20180629T000241_PVI.jp2"),
                },
                "TCI": {
                    "layer": 1,
                    "path": path_offset("IMG_DATA/T56JMM_20180629T000241_TCI.jp2"),
                },
            },
            "cloud_cover_percentage": 0.0,
            "degraded_anc_data_percentage": 0.0,
            "degraded_msi_data_percentage": 0.0,
            "format_quality_flag": "",
            "general_quality_flag": "",
            "geometric_quality_flag": "",
            "null_value": "0",
            "radiometric_quality_flag": "",
            "reflectance_conversion": "0.967798898595979",
            "saturated": "65535",
            "sensor_quality_flag": "",
            "solar_irradiance": [
                {"bandId": "0", "unit": "W/m²/µm", "value": "1884.69"},
                {"bandId": "1", "unit": "W/m²/µm", "value": "1959.72"},
                {"bandId": "2", "unit": "W/m²/µm", "value": "1823.24"},
                {"bandId": "3", "unit": "W/m²/µm", "value": "1512.06"},
                {"bandId": "4", "unit": "W/m²/µm", "value": "1424.64"},
                {"bandId": "5", "unit": "W/m²/µm", "value": "1287.61"},
                {"bandId": "6", "unit": "W/m²/µm", "value": "1162.08"},
                {"bandId": "7", "unit": "W/m²/µm", "value": "1041.63"},
                {"bandId": "8", "unit": "W/m²/µm", "value": "955.32"},
                {"bandId": "9", "unit": "W/m²/µm", "value": "812.92"},
                {"bandId": "10", "unit": "W/m²/µm", "value": "367.15"},
                {"bandId": "11", "unit": "W/m²/µm", "value": "245.59"},
                {"bandId": "12", "unit": "W/m²/µm", "value": "85.25"},
            ],
            "sun_azimuth": 28.9784209875988,
            "sun_elevation": 59.5161129280706,
            "tile_reference": "N02.06",
            "viewing_angles": [
                {
                    "bandId": "0",
                    "measurement": {
                        "azimuth": {"value": 287.743300570742},
                        "zenith": {"value": 8.90682426360539},
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "9",
                    "measurement": {
                        "azimuth": {"value": 287.913358161721},
                        "zenith": {"value": 8.93763578589198},
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "10",
                    "measurement": {
                        "azimuth": {"value": 286.62269660653},
                        "zenith": {"value": 8.77437299338626},
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "1",
                    "measurement": {
                        "azimuth": {"value": 286.085976995274},
                        "zenith": {"value": 8.70023786261715},
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "2",
                    "measurement": {
                        "azimuth": {"value": 286.471239179063},
                        "zenith": {"value": 8.72476018739389},
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "3",
                    "measurement": {
                        "azimuth": {"value": 286.832768592131},
                        "zenith": {"value": 8.75574267151839},
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "4",
                    "measurement": {
                        "azimuth": {"value": 287.013584765891},
                        "zenith": {"value": 8.77685536841587},
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "5",
                    "measurement": {
                        "azimuth": {"value": 287.207324001684},
                        "zenith": {"value": 8.80050900146543},
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "6",
                    "measurement": {
                        "azimuth": {"value": 287.400419388821},
                        "zenith": {"value": 8.8344918122903},
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "7",
                    "measurement": {
                        "azimuth": {"value": 286.272771889735},
                        "zenith": {"value": 8.71220887022109},
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "8",
                    "measurement": {
                        "azimuth": {"value": 287.592709087249},
                        "zenith": {"value": 8.86277189674952},
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "11",
                    "measurement": {
                        "azimuth": {"value": 287.100489102096},
                        "zenith": {"value": 8.84204098088515},
                    },
                    "unit": "degree",
                },
                {
                    "bandId": "12",
                    "measurement": {
                        "azimuth": {"value": 287.498739900102},
                        "zenith": {"value": 8.90079212851159},
                    },
                    "unit": "degree",
                },
            ],
        },
        "instrument": {"name": "MSI"},
        "lineage": {"source_datasets": {}},
        "orbit": "30",
        "orbit_direction": "DESCENDING",
        "platform": {"code": "Sentinel-2A"},
        "processing_baseline": "02.06",
        "processing_level": "Level-1C",
        "product_format": {"name": "SAFE_COMPACT"},
        "product_type": "S2MSI1C",
        "product_uri": "S2A_MSIL1C_20180629T000241_N0206_R030_T56JMM_20180629T012042.SAFE",
        "size_bytes": 1837225,
        "tile_id": "S2A_OPER_MSI_L1C_TL_EPAE_20180629T012042_A015757_T56JMM_N02.06",
    }

    check_prepare_outputs(
        invoke_script=s2_prepare_cophub_zip.main,
        run_args=[
            "--newer-than",
            "1970-01-01",
            "--output",
            str(output_path),
            str(L1_ZIPFILE_PATH),
        ],
        expected_doc=expected_doc,
        expected_metadata_path=expected_metadata_path,
    )