test_that("USGS discovery uses original assets and explicit pagination", { roi<-sf::st_as_sfc(sf::st_bbox(c(xmin=-119,ymin=34,xmax=-118,ymax=35),crs=4326)) item<-list(sourceId="id",title="Original cloud",sizeInBytes=123, downloadURL="https://rockyweb.usgs.gov/Projects/a/LAZ/t.laz",metaUrl="https://www.sciencebase.gov/catalog/item/id", vendorMetaUrl="https://example.org/t.xml",boundingBox=list(minX=-118.9,minY=34.1,maxX=-118.8,maxY=34.2)) calls<-0L local_mocked_bindings(request_json=function(url,body=NULL,query=NULL) { expect_match(url,"tnmaccess",fixed=TRUE);calls<<-calls+1L if(calls==1L) list(total=2,items=list(item)) else list(total=2,items=list()) },.package="ALSdownloadeR") expect_error(find_als_usgs(roi,10),"ended early") local_mocked_bindings(request_json=function(...)list(total=1,items=list(item)),.package="ALSdownloadeR") x<-find_als_usgs(roi,10) expect_equal(x$url,item$downloadURL);expect_equal(x$size_bytes,123) expect_equal(asset_access_url(x),item$downloadURL) }) test_that("acquisition XML distinguishes ground dates from publication", { xml<-function(current,dates) paste0('',current, '',dates,'') range<-'2018052720181012' x<-extract_als_dates_usgs(xml("ground condition",range)) expect_equal(x$year,2018);expect_equal(x$end,"2018-10-12") expect_null(extract_als_dates_usgs(xml("publication date",range))) days<-'2022032620220330' expect_equal(extract_als_dates_usgs(xml("ground condition",days))$end,"2022-03-30") expect_null(extract_als_dates_usgs(xml("ground condition",gsub("20181012","20180230",range)))) y<-extract_als_dates_usgs(xml("ground condition",'20182019')) expect_equal(y$year,2019);expect_true(is.na(y$end)) }) test_that("partial HTTP replies never mistake one byte for the file", { headers<-function(x) charToRaw(paste0("HTTP/1.1 206 Partial Content\r\n",x,"\r\n\r\n")) expect_equal(http_asset_size(206,headers("Content-Length: 1\r\nContent-Range: bytes 0-0/123456"),TRUE),123456) expect_true(is.na(http_asset_size(200,headers("Content-Length: 1"),TRUE))) expect_true(is.na(http_asset_size(206,headers("Content-Range: bytes 0-0/*"),TRUE))) expect_true(is.na(http_asset_size(200,headers("Content-Length: 200\r\nContent-Type: text/html")))) expect_true(is.na(http_asset_size(200,headers("Content-Length: 200\r\nContent-Encoding: gzip")))) }) test_that("totals exclude duplicate accesses and remain incomplete with NA", { x<-data.frame(url=c("https://example.org/a?token=1","https://example.org/a?token=2","https://example.org/b"),size_bytes=c(100,100,NA)) s<-summarize_als_download(x) expect_equal(s$files,2L);expect_equal(s$known_bytes,100) expect_equal(s$missing_sizes,1L);expect_true(is.na(s$total_bytes));expect_false(s$complete) expect_match(report_date_label(c("2020-01-01",NA),c("2020-12-31",NA)),"incomplete") }) test_that("asset identities preserve resource queries but ignore access tokens", { expect_equal(asset_identity_url("https://example.org/t?id=1&token=a"), asset_identity_url("https://example.org/t?token=b&id=1")) expect_false(identical(asset_identity_url("https://example.org/t?id=1"), asset_identity_url("https://example.org/t?id=2"))) }) test_that("harmonized year selection uses the final acquisition year", { x<-data.frame(acquisition_year=c(2019L,NA_integer_),acquired_start=c("2018-01-01",NA),acquired_end=c("2019-02-01",NA)) expect_equal(tile_year_membership(x),list("2019","unknown")) }) test_that("AHN flight strips supply their own documented dates", { g<-sf::st_as_sfc(sf::st_bbox(c(xmin=100000,ymin=400000,xmax=100100,ymax=400100),crs=28992)) index<-sf::st_sf(datum_str=c("2025-03-07","2025-03-09"),geometry=c(g,g)) path<-tempfile(fileext=".gpkg");on.exit(unlink(path),add=TRUE) sf::st_write(index,path,quiet=TRUE) old<-options(ALSdownloadeR.ahn_date_index=path);on.exit(options(old),add=TRUE) tiles<-als_metadata_columns(sf::st_sf(provider="ahn6",filename="AHN6_2025_tile.laz", acquired_start=NA_character_,acquired_end=NA_character_,geometry=g)) x<-extract_als_dates_ahn(tiles) expect_equal(x$acquired_end,"2025-03-09");expect_equal(x$acquisition_year,2025L) expect_equal(x$date_scope,"intersecting_flight_strips") }) test_that("Swiss metadata must match the tile version", { g<-sf::st_as_sfc(sf::st_bbox(c(xmin=2494000,ymin=1140000,xmax=2495000,ymax=1141000),crs=2056)) x<-als_metadata_columns(sf::st_sf(provider="swisstopo",filename="swisssurface3d_2015_2494-1140.las.zip",geometry=g)) local_mocked_bindings(request_json=function(...)list(results=list(list(id="2494_1140",attributes=list(gpstime_min=2023,gpstime_max=2023)))),.package="ALSdownloadeR") expect_true(is.na(extract_als_dates_swisstopo(x)$acquisition_year)) local_mocked_bindings(request_json=function(...)list(results=list(list(id="2494_1140",attributes=list(gpstime_min=2015,gpstime_max=2015)))),.package="ALSdownloadeR") y<-extract_als_dates_swisstopo(x) expect_equal(y$acquisition_year,2015L);expect_equal(y$date_precision,"year") }) test_that("only the observed AHN sentinel allows exhausted pages with next links", { prefix<-"https://api.ellipsis-drive.com/test/" page<-list(type="FeatureCollection",features=list(),numberReturned=0,numberMatched=999999999, links=list(list(rel="self",href=paste0(prefix,"items")),list(rel="next",href=paste0(prefix,"items")))) local_mocked_bindings(request_json=function(...)page,.package="ALSdownloadeR") expect_length(native_pages(paste0(prefix,"items"),prefix,10),0) page$links[[2]]$href <- paste0(prefix,"items?limit=100") expect_length(native_pages(paste0(prefix,"items?offset=last"),prefix,10),0) expect_error(native_pages("https://example.org/items","https://example.org/",10),"Invalid index pagination") })