Compare commits

...

10 commits

Author SHA1 Message Date
Simon
b09eb2c473 Add regression tests for script helpers 2026-04-11 09:26:04 +01:00
Simon
8b8255bab5 Fix sourced Meteo France API helpers 2026-04-11 09:24:56 +01:00
Simon
605c946da2 add missing dependencies 2025-10-02 10:43:38 +01:00
Simon
103e73a15f minor edit 2025-10-02 10:42:13 +01:00
Simon
25aaede9aa add all station in data 2025-10-02 10:39:03 +01:00
Simon
51e65acee6 add all station in data 2025-10-02 10:37:54 +01:00
Simon
c20844cb56 remove devtools dependancy 2025-10-02 10:36:50 +01:00
Simon
5bc3fc1f10 petit app shiny parce que voila quoi 2025-10-02 10:33:02 +01:00
Simon
9214b2b2fa rienaf, jenvoie mon api metoe france 2025-10-02 10:32:45 +01:00
Simon
754adc72d7 ajouter un temps dattent qui augment avec le nombre d'erreur 2025-10-02 10:32:21 +01:00
10 changed files with 2403 additions and 66 deletions

57
R/getAllFromCoord.R Normal file
View file

@ -0,0 +1,57 @@
combine_station_payloads <- function(station_payloads, station_lookup) {
station_payloads <- Filter(function(x) !is.null(x) && nrow(x), station_payloads)
if (!length(station_payloads)) {
return(NULL)
}
combined <- do.call("rbind.data.frame", station_payloads)
station_column <- c("POSTE", "geo_id_insee")
station_column <- station_column[station_column %in% names(combined)][1]
if (is.na(station_column)) {
return(combined)
}
combined$Nom_usuel <- unname(station_lookup[as.character(combined[[station_column]])])
combined
}
# Define function
getAllFromCoord <- function(coord, start_date, end_date, allstations, N = 3, headers, base = "https://public-api.meteofrance.fr",btw_station_sleep = 1, within_statio_sleep=5,endpoint="public/DPClim/v1/") {
three_station = getIdFromCoords(coord, allstations, N = N)
alldata = lapply(three_station$Id_station, function(statid) {
print(paste("recuperer station", statid))
allstat = tryCatch(
getStationData(start_date = start_date, end_date = end_date, station_id = statid, headers = headers, base = base, timesleep=within_statio_sleep,dpclim=endpoint),
error = function(e) {print(e); NULL}
)
print(paste("done, sleep",btw_station_sleep,"sec"))
print(dim(allstat))
Sys.sleep(btw_station_sleep)
return(allstat)
})
ids = three_station$Nom_usuel
names(ids) = three_station$Id_station
combine_station_payloads(alldata, ids)
}
# Define function
getAllFromCoordDPObs <- function(coord, start_date, end_date, allstations, N = 3, headers, base = "https://public-api.meteofrance.fr",btw_station_sleep = 1, within_statio_sleep=5,endpoint="public/DPClim/v1/") {
three_station = getIdFromCoords(coord, allstations, N = N)
alldata = lapply(three_station$Id_station, function(statid) {
print(paste("recuperer station", statid))
allstat = tryCatch(
getStationDataDPObs(start_date = start_date, end_date = end_date, station_id = statid, headers = headers, base = base, timesleep=within_statio_sleep,dpclim=endpoint),
error = function(e) {print(e); NULL}
)
print(paste("done, sleep",btw_station_sleep,"sec"))
print(dim(allstat))
Sys.sleep(btw_station_sleep)
return(allstat)
})
ids = three_station$Nom_usuel
names(ids) = three_station$Id_station
combine_station_payloads(alldata, ids)
}

View file

@ -1,7 +1,7 @@
getStationData <- function(start_date, end_date, station_id,headers ,dpclim = "public/DPClim/v1/",timesleep=5,base="https://public-api.meteofrance.fr") {
start_date <- as.Date(start_date)
end_date <- as.Date(end_date)
url <- modify_url(base,path = paste0(dpclim,"commande-station/infrahoraire-6m"))
url <- httr::modify_url(base,path = paste0(dpclim,"commande-station/infrahoraire-6m"))
# Format dates in ISO8601 format
formatted_start_date <- format(start_date, "%Y-%m-%dT00:00:00Z", tz = "GMT")
formatted_end_date <- format(end_date, "%Y-%m-%dT00:00:00Z", tz = "GMT")
@ -9,31 +9,34 @@ getStationData <- function(start_date, end_date, station_id,headers ,dpclim = "p
parameters <- list("id-station" = station_id, "date-deb-periode" = formatted_start_date, "date-fin-periode" = formatted_end_date)
# Create the URL with parameters to ask for the csv file
url_query_file <- modify_url(url, query = parameters)
url_query_file <- httr::modify_url(url, query = parameters)
response <- request_api(url_query_file, headers=headers,code=202)
if(response$status_code == 202){
url_fichier <- modify_url(base,path = paste0(dpclim,"commande/fichier"))
parameters <- list("id-cmde" = content(response)[[1]][[1]] )
if(!is.null(response) && response$status_code == 202){
url_fichier <- httr::modify_url(base,path = paste0(dpclim,"commande/fichier"))
parameters <- list("id-cmde" = httr::content(response)[[1]][[1]] )
print(paste("Waiting for file",parameters[["id-cmde"]],"wait",timesleep,"secs"))
Sys.sleep(timesleep)
url_get_file <- modify_url(url_fichier, query = parameters)
url_get_file <- httr::modify_url(url_fichier, query = parameters)
response <- request_api(url_get_file, headers=headers,code=c(204,201,500))
while(response$status_code %in% c(204,500)){
while(!is.null(response) && response$status_code %in% c(204,500)){
print("file not ready yet, wait a minute more")
Sys.sleep(60)
response <- request_api(url_get_file, headers=headers,code=c(204,201,500))
if(response$status_code == 500){
if(!is.null(response) && response$status_code == 500){
print("problem with file generation, retry")
response <- request_api(url_query_file, headers=headers,code=202)
parameters <- list("id-cmde" = content(response)[[1]][[1]] )
if (is.null(response)) {
break
}
parameters <- list("id-cmde" = httr::content(response)[[1]][[1]] )
print(paste("Waiting for file",parameters[["id-cmde"]],"wait 25 sec"))
Sys.sleep(25)
url_get_file <- modify_url(url_fichier, query = parameters)
url_get_file <- httr::modify_url(url_fichier, query = parameters)
response <- request_api(url_get_file, headers=headers,code=c(204,201,500))
}
}
if(response$status_code == 201){
return(read.csv(text=content(response,as="text")[[1]],sep=";",header=T,dec = ","))
if(!is.null(response) && response$status_code == 201){
return(read.csv(text=httr::content(response,as="text")[[1]],sep=";",header=T,dec = ","))
}
}
print("Failed to retrieve data from the API. Why? not sure..")
@ -44,7 +47,7 @@ getStationData <- function(start_date, end_date, station_id,headers ,dpclim = "p
getStationDataDPObs <- function(start_date, end_date, station_id,headers ,dpclim = "public/DPClim/v1/",timesleep=5,base="https://public-api.meteofrance.fr") {
start_date <- as.Date(start_date)
end_date <- as.Date(end_date)
url <- modify_url(base,path = paste0(dpclim,"commande-station/infrahoraire-6m"))
url <- httr::modify_url(base,path = paste0(dpclim,"commande-station/infrahoraire-6m"))
# Format dates in ISO8601 format
formatted_start_date <- format(start_date, "%Y-%m-%dT00:00:00Z", tz = "GMT")
formatted_end_date <- format(end_date, "%Y-%m-%dT00:00:00Z", tz = "GMT")
@ -52,31 +55,34 @@ getStationDataDPObs <- function(start_date, end_date, station_id,headers ,dpclim
parameters <- list("id-station" = station_id, "date-deb-periode" = formatted_start_date, "date-fin-periode" = formatted_end_date)
# Create the URL with parameters to ask for the csv file
url_query_file <- modify_url(url, query = parameters)
url_query_file <- httr::modify_url(url, query = parameters)
response <- request_api(url_query_file, headers=headers,code=202)
if(response$status_code == 202){
url_fichier <- modify_url(base,path = paste0(dpclim,"commande/fichier"))
parameters <- list("id-cmde" = content(response)[[1]][[1]] )
if(!is.null(response) && response$status_code == 202){
url_fichier <- httr::modify_url(base,path = paste0(dpclim,"commande/fichier"))
parameters <- list("id-cmde" = httr::content(response)[[1]][[1]] )
print(paste("Waiting for file",parameters[["id-cmde"]],"wait",timesleep,"secs"))
Sys.sleep(timesleep)
url_get_file <- modify_url(url_fichier, query = parameters)
url_get_file <- httr::modify_url(url_fichier, query = parameters)
response <- request_api(url_get_file, headers=headers,code=c(204,201,500))
while(response$status_code %in% c(204,500)){
while(!is.null(response) && response$status_code %in% c(204,500)){
print("file not ready yet, wait a minute more")
Sys.sleep(60)
response <- request_api(url_get_file, headers=headers,code=c(204,201,500))
if(response$status_code == 500){
if(!is.null(response) && response$status_code == 500){
print("problem with file generation, retry")
response <- request_api(url_query_file, headers=headers,code=202)
parameters <- list("id-cmde" = content(response)[[1]][[1]] )
if (is.null(response)) {
break
}
parameters <- list("id-cmde" = httr::content(response)[[1]][[1]] )
print(paste("Waiting for file",parameters[["id-cmde"]],"wait 25 sec"))
Sys.sleep(25)
url_get_file <- modify_url(url_fichier, query = parameters)
url_get_file <- httr::modify_url(url_fichier, query = parameters)
response <- request_api(url_get_file, headers=headers,code=c(204,201,500))
}
}
if(response$status_code == 201){
return(read.csv(text=content(response,as="text")[[1]],sep=";",header=T,dec = ","))
if(!is.null(response) && response$status_code == 201){
return(read.csv(text=httr::content(response,as="text")[[1]],sep=";",header=T,dec = ","))
}
}
print("Failed to retrieve data from the API. Why? not sure..")
@ -86,7 +92,7 @@ getStationDataDPObs <- function(start_date, end_date, station_id,headers ,dpclim
getStationDataTemp <- function(start_date, end_date, station_id,headers ,dpclim = "public/DPClim/v1/",timesleep=5,base="https://public-api.meteofrance.fr") {
start_date <- as.Date(start_date)
end_date <- as.Date(end_date)
url <- modify_url(base,path = paste0(dpclim,"commande-station/infrahoraire-6m"))
url <- httr::modify_url(base,path = paste0(dpclim,"commande-station/infrahoraire-6m"))
# Format dates in ISO8601 format
formatted_start_date <- format(start_date, "%Y-%m-%dT00:00:00Z", tz = "GMT")
formatted_end_date <- format(end_date, "%Y-%m-%dT00:00:00Z", tz = "GMT")
@ -94,31 +100,34 @@ getStationDataTemp <- function(start_date, end_date, station_id,headers ,dpclim
parameters <- list("id-station" = station_id, "date-deb-periode" = formatted_start_date, "date-fin-periode" = formatted_end_date)
# Create the URL with parameters to ask for the csv file
url_query_file <- modify_url(url, query = parameters)
url_query_file <- httr::modify_url(url, query = parameters)
response <- request_api(url_query_file, headers=headers,code=202)
if(response$status_code == 202){
url_fichier <- modify_url(base,path = paste0(dpclim,"commande/fichier"))
parameters <- list("id-cmde" = content(response)[[1]][[1]] )
if(!is.null(response) && response$status_code == 202){
url_fichier <- httr::modify_url(base,path = paste0(dpclim,"commande/fichier"))
parameters <- list("id-cmde" = httr::content(response)[[1]][[1]] )
print(paste("Waiting for file",parameters[["id-cmde"]],"wait",timesleep,"secs"))
Sys.sleep(timesleep)
url_get_file <- modify_url(url_fichier, query = parameters)
url_get_file <- httr::modify_url(url_fichier, query = parameters)
response <- request_api(url_get_file, headers=headers,code=c(204,201,500))
while(response$status_code %in% c(204,500)){
while(!is.null(response) && response$status_code %in% c(204,500)){
print("file not ready yet, wait a minute more")
Sys.sleep(60)
response <- request_api(url_get_file, headers=headers,code=c(204,201,500))
if(response$status_code == 500){
if(!is.null(response) && response$status_code == 500){
print("problem with file generation, retry")
response <- request_api(url_query_file, headers=headers,code=202)
parameters <- list("id-cmde" = content(response)[[1]][[1]] )
if (is.null(response)) {
break
}
parameters <- list("id-cmde" = httr::content(response)[[1]][[1]] )
print(paste("Waiting for file",parameters[["id-cmde"]],"wait 25 sec"))
Sys.sleep(25)
url_get_file <- modify_url(url_fichier, query = parameters)
url_get_file <- httr::modify_url(url_fichier, query = parameters)
response <- request_api(url_get_file, headers=headers,code=c(204,201,500))
}
}
if(response$status_code == 201){
return(read.csv(text=content(response,as="text")[[1]],sep=";",header=T,dec = ","))
if(!is.null(response) && response$status_code == 201){
return(read.csv(text=httr::content(response,as="text")[[1]],sep=";",header=T,dec = ","))
}
}
print("Failed to retrieve data from the API. Why? not sure..")
@ -129,7 +138,7 @@ getStationDataTemp <- function(start_date, end_date, station_id,headers ,dpclim
getStationDataDPObs <- function(start_date, end_date, station_id,headers ,dpclim = "public/DPObs/v1/",timesleep=5,base="https://public-api.meteofrance.fr") {
start_date <- as.Date(start_date)
end_date <- as.Date(end_date)
url <- modify_url(base,path = paste0(dpclim,"station/infrahoraire-6m"))
url <- httr::modify_url(base,path = paste0(dpclim,"station/infrahoraire-6m"))
# Format dates in ISO8601 format
formatted_start_date <- format(start_date, "%Y-%m-%dT12:00:00Z", tz = "GMT")
formatted_end_date <- format(end_date, "%Y-%m-%dT00:00:00Z", tz = "GMT")
@ -137,7 +146,7 @@ getStationDataDPObs <- function(start_date, end_date, station_id,headers ,dpclim
parameters <- list("id_station" = station_id, "date" = formatted_start_date,'format'='csv')
# Create the URL with parameters to ask for the csv file
url_query_file <- modify_url(url, query = parameters)
url_query_file <- httr::modify_url(url, query = parameters)
response <- request_api(url_query_file, headers=headers,code=200)
print(response)
#if(response$status_code == 202){
@ -168,4 +177,3 @@ getStationDataDPObs <- function(start_date, end_date, station_id,headers ,dpclim
#print("Failed to retrieve data from the API. Why? not sure..")
#return(NULL)
}

View file

@ -1,14 +1,13 @@
getStationInfo <- function(station, headers,infostat = "information-station",dpclim = "public/DPClim/v1/") {
# Assuming 'base' and 'dpclim' are defined externally; include 'infostat' parameter appropriately
url <- modify_url(base, path = paste0(dpclim, infostat), query = list("id-station" = station))
response <- GET(url, headers)
url <- httr::modify_url(base, path = paste0(dpclim, infostat), query = list("id-station" = station))
response <- httr::GET(url, headers)
# Check if the request was successful
if (http_status(response)$category == "Success") { # Ensure 'success' is lowercase as typically returned by the http_status() function
if (httr::http_status(response)$category == "Success") {
# Properly parsing the content as CSV by directly reading the response text
data <- read.csv(text = content(response, as = "text"), sep = ";", header = TRUE)
data <- read.csv(text = httr::content(response, as = "text"), sep = ";", header = TRUE)
return(data)
}
stop(sprintf("Failed to get station info from the API. Status code: %s", response$status_code))
}

View file

@ -1,15 +1,31 @@
getStationPaquet <- function(id_station, format = "csv", headers = headersPaquet) {
base_url <- modify_url(base, path = paste0(dpPaquetObs, "infrahoraire-6m"))
url_with_params <- modify_url(base_url, query = list(id_station = id_station, format = format))
getStationPaquet <- function(
id_station,
format = "csv",
headers,
endpoint = paste0(dpPaquetObs, "infrahoraire-6m")
) {
url_with_params <- httr::modify_url(
base,
path = endpoint,
query = list(id_station = id_station, format = format)
)
response <- GET(url_with_params, add_headers(.headers = headers))
response <- request_api(
url_with_params = url_with_params,
headers = headers,
code = 200,
retry_limit = 3,
timesleep = 5
)
if (response$status_code == 200) {
# Successfully retrieved the data
return(read.csv(text = content(response, "text"), sep = ";", header = TRUE))
} else {
# If the request failed, it's useful to provide the status code in the error message for debugging
stop(sprintf("Failed to retrieve data as paquet from the API. Status code: %s", response$status_code))
if (is.null(response)) {
return(NULL)
}
}
read.csv(
text = httr::content(response, "text", encoding = "UTF-8"),
sep = ";",
header = TRUE,
stringsAsFactors = FALSE
)
}

View file

@ -1,11 +1,11 @@
getStations <- function(headers = headers,dpobs = "public/DPObs/v1/") {
# Ensure dpobs is defined externally or provide a default/argument for it
url <- modify_url(base, path = paste0(dpobs, "liste-stations"))
response <- GET(url, add_headers(.headers = headers))
url <- httr::modify_url(base, path = paste0(dpobs, "liste-stations"))
response <- httr::GET(url, httr::add_headers(.headers = headers))
# Better error handling
if (http_status(response)$category == "success") {
if (httr::http_status(response)$category == "Success") {
# Directly parse the content as a CSV
data <- content(response, as = "text")
data <- httr::content(response, as = "text")
# Return the data frame
return(read.csv(text = data, sep = ";", header = TRUE))
} else {
@ -16,4 +16,3 @@ getStations <- function(headers = headers,dpobs = "public/DPObs/v1/") {
}
}

View file

@ -29,7 +29,7 @@ request_api <- function(url_with_params,headers,code,retry_limit=5,timesleep=20)
success <- FALSE
while(retry_count < retry_limit && !success) {
response <- tryCatch(GET(url_with_params, headers),error=function(e){print(e);NULL})
response <- tryCatch(httr::GET(url_with_params, headers),error=function(e){print(e);NULL})
print(response)
if(!is.null(response) && (response$status_code %in% code)) {
success <- TRUE
@ -37,11 +37,10 @@ request_api <- function(url_with_params,headers,code,retry_limit=5,timesleep=20)
print(url_with_params)
print(paste0("retry #",retry_count,"/",retry_limit))
retry_count <- retry_count + 1
Sys.sleep(timesleep)
Sys.sleep(timesleep*(1+retry_count/retry_limit))
}
}
if(!success) return(NULL)
else return(response)
}

96
app.R Normal file
View file

@ -0,0 +1,96 @@
# Load necessary libraries
library(shiny)
library(jsonlite)
library(httr)
library(shinycssloaders) # For the spinner
# Assuming you have your custom functions in a file called 'your_functions.R'
# List all R files in the directory and source them
lapply(list.files(path = "R", pattern = "\\.R$", full.names = T), source)
source("data/secrets")
# Create a Bearer token header
headers.default <- add_headers(
accept = "*/*",
apikey = token4
)
# Load station data
# Define UI for application
ui <- fluidPage(
tags$head(
tags$style(HTML("
#main {
height: 100vh; /* Full height of the viewport */
overflow-y: auto; /* Scroll if content overflows */
}
.container-fluid {
height: 100vh; /* Full height of the viewport */
display: flex;
flex-direction: column;
}
.row {
flex-grow: 1;
display: flex;
}
.col-sm-8 {
flex-grow: 1; /* Allow the main panel to grow */
}
"))
),
# Application title
titlePanel("Beaumont aka SECMONT"),
# Sidebar for user inputs
sidebarLayout(
sidebarPanel(
width=2,
numericInput(inputId = "daysBefore", label = "Nb jour à check:", value=10, min=1)
),
# Main panel for displaying plot
mainPanel(
width = 6,
withSpinner( plotOutput("dataPlot"))
)
)
)
# Define server logic required to generate and plot data
server <- function(input, output) {
# Reactive expression to fetch data based on input and display spinner while loading
# Render the plot
output$dataPlot <- renderPlot({
startdate <- format(Sys.Date() - input$daysBefore, "%Y-%m-%d")
vignass.coor=c(44.8550665,5.8441789)
allstations <- read.csv("data/allstations.csv")
test1 <- getAllFromCoord(vignass.coor, start_date = startdate, end_date = format(Sys.Date(), "%Y-%m-%d"), allstations, headers = headers.default,btw_station_sleep = .5,within_statio_sleep = 1)
# Prepare colors
cols <- palette.colors()[1:length(unique(test1$Nom_usuel))]
names(cols) <- unique(test1$Nom_usuel)
# Filter data
testsep <- test1
testsep[testsep[,3] == 0 & !is.na(testsep[,3]), c(3,4)] <- NA
plot(getDate(testsep[,2]), testsep[,3], pch = 20, col = adjustcolor(cols[testsep$Nom_usuel], .4), cex = 1.3, ylim = c(0, 8))
# Add legend
legend("topleft", col = cols, legend = names(cols), pch = 20, cex = 1)
# Highlight specific date
abline(v = as.numeric(as.POSIXlt("2024-08-07", format = "%Y-%m-%d")), lwd = 3, col = "red")
})
}
# Run the application
shinyApp(ui = ui, server = server)

2113
data/allstations.csv Normal file

File diff suppressed because it is too large Load diff

6
data/secrets Normal file
View file

@ -0,0 +1,6 @@
token2="eyJ4NXQiOiJZV0kxTTJZNE1qWTNOemsyTkRZeU5XTTRPV014TXpjek1UVmhNbU14T1RSa09ETXlOVEE0Tnc9PSIsImtpZCI6ImdhdGV3YXlfY2VydGlmaWNhdGVfYWxpYXMiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJzaW1vbkNhcnJpZ25vbkBjYXJib24uc3VwZXIiLCJhcHBsaWNhdGlvbiI6eyJvd25lciI6InNpbW9uQ2Fycmlnbm9uIiwidGllclF1b3RhVHlwZSI6bnVsbCwidGllciI6IlVubGltaXRlZCIsIm5hbWUiOiJEZWZhdWx0QXBwbGljYXRpb24iLCJpZCI6MTIxODksInV1aWQiOiI1NGE5MTcyMy1iMzMwLTQ0MmMtODI0Ni1jNTc1MzMzZTMwZWQifSwiaXNzIjoiaHR0cHM6XC9cL3BvcnRhaWwtYXBpLm1ldGVvZnJhbmNlLmZyOjQ0M1wvb2F1dGgyXC90b2tlbiIsInRpZXJJbmZvIjp7IjUwUGVyTWluIjp7InRpZXJRdW90YVR5cGUiOiJyZXF1ZXN0Q291bnQiLCJncmFwaFFMTWF4Q29tcGxleGl0eSI6MCwiZ3JhcGhRTE1heERlcHRoIjowLCJzdG9wT25RdW90YVJlYWNoIjp0cnVlLCJzcGlrZUFycmVzdExpbWl0IjowLCJzcGlrZUFycmVzdFVuaXQiOiJzZWMifX0sImtleXR5cGUiOiJQUk9EVUNUSU9OIiwic3Vic2NyaWJlZEFQSXMiOlt7InN1YnNjcmliZXJUZW5hbnREb21haW4iOiJjYXJib24uc3VwZXIiLCJuYW1lIjoiRG9ubmVlc1B1YmxpcXVlc09ic2VydmF0aW9uIiwiY29udGV4dCI6IlwvcHVibGljXC9EUE9ic1wvdjEiLCJwdWJsaXNoZXIiOiJiYXN0aWVuZyIsInZlcnNpb24iOiJ2MSIsInN1YnNjcmlwdGlvblRpZXIiOiI1MFBlck1pbiJ9LHsic3Vic2NyaWJlclRlbmFudERvbWFpbiI6ImNhcmJvbi5zdXBlciIsIm5hbWUiOiJEb25uZWVzUHVibGlxdWVzQ2xpbWF0b2xvZ2llIiwiY29udGV4dCI6IlwvcHVibGljXC9EUENsaW1cL3YxIiwicHVibGlzaGVyIjoiYWRtaW5fbWYiLCJ2ZXJzaW9uIjoidjEiLCJzdWJzY3JpcHRpb25UaWVyIjoiNTBQZXJNaW4ifV0sInRva2VuX3R5cGUiOiJhcGlLZXkiLCJpYXQiOjE3MTM4NjM2MjAsImp0aSI6IjMyMjliZTAxLTU5YWQtNDBmNi1hYWViLWY4YzQ1YzY1MDIyZSJ9.BqODnmumpJ0HoAwtPsiUNYbsocj7YEusnE7lY_5pCxAHXCmMJ9GMKaA7E3_x7hfACSJx05m5Ekm_Fs2zHs4RmAmLO258jdvGWnRcf_3wjl-fO_Rm1I1atsmW4gLGkk0krZRhdbnVwml6S-pyvMmoO9vjy-lpr64bFndCLA2xqmfrhjJhwAh5RSx7PFF-MVikUpyb4pIw0emQ9T3vSP8aOYBruKs9l4jrsfphHBxleSVX-UM6nExueAAY15uIVUefOq3eaGncstERODHZpalW59nD-BZApHF1UuEJbZeEPB_dRhEE0IfLF8cTwiuupGapPQrFebwFyZDgCFiF8gSu_g=="
token='eyJ4NXQiOiJZV0kxTTJZNE1qWTNOemsyTkRZeU5XTTRPV014TXpjek1UVmhNbU14T1RSa09ETXlOVEE0Tnc9PSIsImtpZCI6ImdhdGV3YXlfY2VydGlmaWNhdGVfYWxpYXMiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJzaW1vbkNhcnJpZ25vbkBjYXJib24uc3VwZXIiLCJhcHBsaWNhdGlvbiI6eyJvd25lciI6InNpbW9uQ2Fycmlnbm9uIiwidGllclF1b3RhVHlwZSI6bnVsbCwidGllciI6IlVubGltaXRlZCIsIm5hbWUiOiJEZWZhdWx0QXBwbGljYXRpb24iLCJpZCI6MTIxODksInV1aWQiOiI1NGE5MTcyMy1iMzMwLTQ0MmMtODI0Ni1jNTc1MzMzZTMwZWQifSwiaXNzIjoiaHR0cHM6XC9cL3BvcnRhaWwtYXBpLm1ldGVvZnJhbmNlLmZyOjQ0M1wvb2F1dGgyXC90b2tlbiIsInRpZXJJbmZvIjp7IjUwUGVyTWluIjp7InRpZXJRdW90YVR5cGUiOiJyZXF1ZXN0Q291bnQiLCJncmFwaFFMTWF4Q29tcGxleGl0eSI6MCwiZ3JhcGhRTE1heERlcHRoIjowLCJzdG9wT25RdW90YVJlYWNoIjp0cnVlLCJzcGlrZUFycmVzdExpbWl0IjowLCJzcGlrZUFycmVzdFVuaXQiOiJzZWMifX0sImtleXR5cGUiOiJQUk9EVUNUSU9OIiwic3Vic2NyaWJlZEFQSXMiOlt7InN1YnNjcmliZXJUZW5hbnREb21haW4iOiJjYXJib24uc3VwZXIiLCJuYW1lIjoiRG9ubmVlc1B1YmxpcXVlc09ic2VydmF0aW9uIiwiY29udGV4dCI6IlwvcHVibGljXC9EUE9ic1wvdjEiLCJwdWJsaXNoZXIiOiJiYXN0aWVuZyIsInZlcnNpb24iOiJ2MSIsInN1YnNjcmlwdGlvblRpZXIiOiI1MFBlck1pbiJ9XSwiZXhwIjoxNzE0MTEwNjgxLCJ0b2tlbl90eXBlIjoiYXBpS2V5IiwiaWF0IjoxNzEzODYwNjgxLCJqdGkiOiI2NzczMjNjMy1hN2Q5LTQ0MDctOGZhOC1hOTg0MTY2ZjljZGUifQ==.WMSDZ7_oK3OjsA_1LV2goF0Gs6tybLO26MeiskuUKtPoxG-1pikWdPbT1GvsWLuu3CoAx_1IWNKbGIEXFB9l_ZIiqLCYkSEnjOlOj_ipDj3Ic4kmzBkk-FZO5SEe-de9kOPVPSWvrMuznR9BCeyOWNep-HhP0XB-gW4JsFcSo5n0rDGd_t2CWCxZos4nZwFubo1ReFxVceLOsSfE4q06qQFEcY8WucDO9nGIk_xM4n85ma8HuNXM7iJ4YOYgcWnqgEDjWSatDr-xeQFltceStzUjv9YofyEDsNmVU5f3LyuYJtSl7TIf4PeoW_RURpgfbzpT-gsxUpT1BxfF5HTYgA=='
yearTokenPaquer = "eyJ4NXQiOiJZV0kxTTJZNE1qWTNOemsyTkRZeU5XTTRPV014TXpjek1UVmhNbU14T1RSa09ETXlOVEE0Tnc9PSIsImtpZCI6ImdhdGV3YXlfY2VydGlmaWNhdGVfYWxpYXMiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJzaW1vbkNhcnJpZ25vbkBjYXJib24uc3VwZXIiLCJhcHBsaWNhdGlvbiI6eyJvd25lciI6InNpbW9uQ2Fycmlnbm9uIiwidGllclF1b3RhVHlwZSI6bnVsbCwidGllciI6IlVubGltaXRlZCIsIm5hbWUiOiJEZWZhdWx0QXBwbGljYXRpb24iLCJpZCI6MTIxODksInV1aWQiOiI1NGE5MTcyMy1iMzMwLTQ0MmMtODI0Ni1jNTc1MzMzZTMwZWQifSwiaXNzIjoiaHR0cHM6XC9cL3BvcnRhaWwtYXBpLm1ldGVvZnJhbmNlLmZyOjQ0M1wvb2F1dGgyXC90b2tlbiIsInRpZXJJbmZvIjp7IjUwUGVyTWluIjp7InRpZXJRdW90YVR5cGUiOiJyZXF1ZXN0Q291bnQiLCJncmFwaFFMTWF4Q29tcGxleGl0eSI6MCwiZ3JhcGhRTE1heERlcHRoIjowLCJzdG9wT25RdW90YVJlYWNoIjp0cnVlLCJzcGlrZUFycmVzdExpbWl0IjowLCJzcGlrZUFycmVzdFVuaXQiOiJzZWMifX0sImtleXR5cGUiOiJQUk9EVUNUSU9OIiwic3Vic2NyaWJlZEFQSXMiOlt7InN1YnNjcmliZXJUZW5hbnREb21haW4iOiJjYXJib24uc3VwZXIiLCJuYW1lIjoiRG9ubmVlc1B1YmxpcXVlc09ic2VydmF0aW9uIiwiY29udGV4dCI6IlwvcHVibGljXC9EUE9ic1wvdjEiLCJwdWJsaXNoZXIiOiJiYXN0aWVuZyIsInZlcnNpb24iOiJ2MSIsInN1YnNjcmlwdGlvblRpZXIiOiI1MFBlck1pbiJ9LHsic3Vic2NyaWJlclRlbmFudERvbWFpbiI6ImNhcmJvbi5zdXBlciIsIm5hbWUiOiJEb25uZWVzUHVibGlxdWVzQ2xpbWF0b2xvZ2llIiwiY29udGV4dCI6IlwvcHVibGljXC9EUENsaW1cL3YxIiwicHVibGlzaGVyIjoiYWRtaW5fbWYiLCJ2ZXJzaW9uIjoidjEiLCJzdWJzY3JpcHRpb25UaWVyIjoiNTBQZXJNaW4ifSx7InN1YnNjcmliZXJUZW5hbnREb21haW4iOiJjYXJib24uc3VwZXIiLCJuYW1lIjoiRG9ubmVlc1B1YmxpcXVlc1BhcXVldE9ic2VydmF0aW9uIiwiY29udGV4dCI6IlwvcHVibGljXC9EUFBhcXVldE9ic1wvdjEiLCJwdWJsaXNoZXIiOiJiYXN0aWVuZyIsInZlcnNpb24iOiJ2MSIsInN1YnNjcmlwdGlvblRpZXIiOiI1MFBlck1pbiJ9XSwiZXhwIjoxNzQ1NDA1MzkyLCJ0b2tlbl90eXBlIjoiYXBpS2V5IiwiaWF0IjoxNzEzODY5MzkyLCJqdGkiOiIyMzQ1NTMyOS0xMTM1LTQ4NmQtOTk5Zi0yYWNlOTYwZWQ0ZGQifQ==.Ia61uXDUbxouhP-wRhJJkIsIBq38Ju3fxFbiirlzR_dQY-LzWhyY_WpCvdOadVFDIeEoPzhav469tcP2HlWCtEmrRa_cms8dZYFqdOCkjRr_vuJc-q7VvQfe29dpZWh347utQR8qg9C-yMU_N6M94h0RhF_KuEMuzfBXaL4vvTeVc7zfRt75gewOS8pOJtJabpzOefZ9GlCtfiYWWRjaQM-3U5PmEj6_Dl-CwbiNEpage8ieYBinx54Z8Wq1i0sVsFv4IA9ukFZyagexq1L0xNs0l3zjY5tc3E8GSF--IGf5hoIhI73K5On3WQq8nmyaa1QiyhP0UqhpXgkCSYKevg=="
token3="eyJ4NXQiOiJZV0kxTTJZNE1qWTNOemsyTkRZeU5XTTRPV014TXpjek1UVmhNbU14T1RSa09ETXlOVEE0Tnc9PSIsImtpZCI6ImdhdGV3YXlfY2VydGlmaWNhdGVfYWxpYXMiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJzaW1vbkNhcnJpZ25vbkBjYXJib24uc3VwZXIiLCJhcHBsaWNhdGlvbiI6eyJvd25lciI6InNpbW9uQ2Fycmlnbm9uIiwidGllclF1b3RhVHlwZSI6bnVsbCwidGllciI6IlVubGltaXRlZCIsIm5hbWUiOiJEZWZhdWx0QXBwbGljYXRpb24iLCJpZCI6MTIxODksInV1aWQiOiI1NGE5MTcyMy1iMzMwLTQ0MmMtODI0Ni1jNTc1MzMzZTMwZWQifSwiaXNzIjoiaHR0cHM6XC9cL3BvcnRhaWwtYXBpLm1ldGVvZnJhbmNlLmZyOjQ0M1wvb2F1dGgyXC90b2tlbiIsInRpZXJJbmZvIjp7IjUwUGVyTWluIjp7InRpZXJRdW90YVR5cGUiOiJyZXF1ZXN0Q291bnQiLCJncmFwaFFMTWF4Q29tcGxleGl0eSI6MCwiZ3JhcGhRTE1heERlcHRoIjowLCJzdG9wT25RdW90YVJlYWNoIjp0cnVlLCJzcGlrZUFycmVzdExpbWl0IjowLCJzcGlrZUFycmVzdFVuaXQiOiJzZWMifX0sImtleXR5cGUiOiJQUk9EVUNUSU9OIiwic3Vic2NyaWJlZEFQSXMiOlt7InN1YnNjcmliZXJUZW5hbnREb21haW4iOiJjYXJib24uc3VwZXIiLCJuYW1lIjoiRG9ubmVlc1B1YmxpcXVlc0NsaW1hdG9sb2dpZSIsImNvbnRleHQiOiJcL3B1YmxpY1wvRFBDbGltXC92MSIsInB1Ymxpc2hlciI6ImFkbWluX21mIiwidmVyc2lvbiI6InYxIiwic3Vic2NyaXB0aW9uVGllciI6IjUwUGVyTWluIn0seyJzdWJzY3JpYmVyVGVuYW50RG9tYWluIjoiY2FyYm9uLnN1cGVyIiwibmFtZSI6IkRvbm5lZXNQdWJsaXF1ZXNPYnNlcnZhdGlvbiIsImNvbnRleHQiOiJcL3B1YmxpY1wvRFBPYnNcL3YxIiwicHVibGlzaGVyIjoiYmFzdGllbmciLCJ2ZXJzaW9uIjoidjEiLCJzdWJzY3JpcHRpb25UaWVyIjoiNTBQZXJNaW4ifSx7InN1YnNjcmliZXJUZW5hbnREb21haW4iOiJjYXJib24uc3VwZXIiLCJuYW1lIjoiRG9ubmVlc1B1YmxpcXVlc1BhcXVldE9ic2VydmF0aW9uIiwiY29udGV4dCI6IlwvcHVibGljXC9EUFBhcXVldE9ic1wvdjEiLCJwdWJsaXNoZXIiOiJiYXN0aWVuZyIsInZlcnNpb24iOiJ2MSIsInN1YnNjcmlwdGlvblRpZXIiOiI1MFBlck1pbiJ9XSwiZXhwIjoxODE4NDg0NzcxLCJ0b2tlbl90eXBlIjoiYXBpS2V5IiwiaWF0IjoxNzIzODExOTcxLCJqdGkiOiIyZDk4ZWZhNy1lMGFlLTQ1ZWYtYjE4ZC1jNjViNTNmNDkzZWQifQ==.sRhaMYEJkk1Ze1GjnfOB8kmVrhop413TasLrFfC4RD0dUkeyuYlAaDzkI-hOnnC-BAJn1NvaCJyGOeLRpN3sNTrUfL1coUmtfnN1HSy74BwkuD1lUJi-nPe1Flz-lQnu0H-iiIcGAignjPCEv_cE3mX9q0-R5UtGzfkAwd9SB6xAn5hItmLQ2sLpuD-Xe6Ut8QXmrrFFQ2h7NOKg5vSIF1PsOvyTyvIqM5d3xG4RHeiBUR7isWfdvOgHcEWn_7bINOPgvgpEH4COHazxGjbZYU4o6_qsBLZ2rpqcDXCQjXnNmwMDDfrt5_3MBTarD7re8VzY2bUitj0AfahRj6cqOA=="
token4="eyJ4NXQiOiJZV0kxTTJZNE1qWTNOemsyTkRZeU5XTTRPV014TXpjek1UVmhNbU14T1RSa09ETXlOVEE0Tnc9PSIsImtpZCI6ImdhdGV3YXlfY2VydGlmaWNhdGVfYWxpYXMiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJzaW1vbkNhcnJpZ25vbkBjYXJib24uc3VwZXIiLCJhcHBsaWNhdGlvbiI6eyJvd25lciI6InNpbW9uQ2Fycmlnbm9uIiwidGllclF1b3RhVHlwZSI6bnVsbCwidGllciI6IlVubGltaXRlZCIsIm5hbWUiOiJEZWZhdWx0QXBwbGljYXRpb24iLCJpZCI6MTIxODksInV1aWQiOiI1NGE5MTcyMy1iMzMwLTQ0MmMtODI0Ni1jNTc1MzMzZTMwZWQifSwiaXNzIjoiaHR0cHM6XC9cL3BvcnRhaWwtYXBpLm1ldGVvZnJhbmNlLmZyOjQ0M1wvb2F1dGgyXC90b2tlbiIsInRpZXJJbmZvIjp7IjUwUGVyTWluIjp7InRpZXJRdW90YVR5cGUiOiJyZXF1ZXN0Q291bnQiLCJncmFwaFFMTWF4Q29tcGxleGl0eSI6MCwiZ3JhcGhRTE1heERlcHRoIjowLCJzdG9wT25RdW90YVJlYWNoIjp0cnVlLCJzcGlrZUFycmVzdExpbWl0IjowLCJzcGlrZUFycmVzdFVuaXQiOiJzZWMifX0sImtleXR5cGUiOiJQUk9EVUNUSU9OIiwic3Vic2NyaWJlZEFQSXMiOlt7InN1YnNjcmliZXJUZW5hbnREb21haW4iOiJjYXJib24uc3VwZXIiLCJuYW1lIjoiRG9ubmVlc1B1YmxpcXVlc0NsaW1hdG9sb2dpZSIsImNvbnRleHQiOiJcL3B1YmxpY1wvRFBDbGltXC92MSIsInB1Ymxpc2hlciI6ImFkbWluX21mIiwidmVyc2lvbiI6InYxIiwic3Vic2NyaXB0aW9uVGllciI6IjUwUGVyTWluIn0seyJzdWJzY3JpYmVyVGVuYW50RG9tYWluIjoiY2FyYm9uLnN1cGVyIiwibmFtZSI6IkRvbm5lZXNQdWJsaXF1ZXNPYnNlcnZhdGlvbiIsImNvbnRleHQiOiJcL3B1YmxpY1wvRFBPYnNcL3YxIiwicHVibGlzaGVyIjoiYmFzdGllbmciLCJ2ZXJzaW9uIjoidjEiLCJzdWJzY3JpcHRpb25UaWVyIjoiNTBQZXJNaW4ifSx7InN1YnNjcmliZXJUZW5hbnREb21haW4iOiJjYXJib24uc3VwZXIiLCJuYW1lIjoiRG9ubmVlc1B1YmxpcXVlc1BhcXVldE9ic2VydmF0aW9uIiwiY29udGV4dCI6IlwvcHVibGljXC9EUFBhcXVldE9ic1wvdjEiLCJwdWJsaXNoZXIiOiJiYXN0aWVuZyIsInZlcnNpb24iOiJ2MSIsInN1YnNjcmlwdGlvblRpZXIiOiI1MFBlck1pbiJ9XSwiZXhwIjoxODE4NDg1MTU5LCJ0b2tlbl90eXBlIjoiYXBpS2V5IiwiaWF0IjoxNzIzODEyMzU5LCJqdGkiOiI4ZGJiYmVkMy1lM2I3LTRmMDQtOTIwZi0wMDRkMzA2YmY0MzMifQ==.IBDs-9hHPJDCFAQVBFU1l8gWwsQcLGeo_pVwz4HTF-aLzPQS9F7P7Z8KxD1hAE6XabIICyci8iLHf7C-UM3lZaLX1j9ejeKkK-G9Haeh-Ufl_QAxs3jTamizwJT3-nieE6fMtBrWKXaSrzIc5Lg7ukRH1tU6_k1pIti1IExZS2t_vjUdGRqWhQaMLo6tyeSA-UopJAuiP7X_TBrphUp__EpFXreFTRZiT17Utzeoyr9eUt1RrD5F-KHb9sdO9zHQTFJ2beSpz9yvRn2MM9UAcO3QDrthgRZJvn0bjunilee_pNhVjEkpsmTEhax8HQuS02e5vImV36QjYLILEZldNg=="

View file

@ -0,0 +1,44 @@
test_that("sourced getStationData handles request failure without attached httr", {
helper_env <- new.env(parent = globalenv())
sys.source(testthat::test_path("..", "..", "R", "getStationData.R"), envir = helper_env)
helper_env$request_api <- function(...) NULL
expect_null(
helper_env$getStationData(
start_date = "2024-01-01",
end_date = "2024-01-02",
station_id = "12345678",
headers = list(),
timesleep = 0
)
)
})
test_that("getAllFromCoord returns NULL when every station fetch fails", {
helper_env <- new.env(parent = globalenv())
sys.source(testthat::test_path("..", "..", "R", "getAllFromCoord.R"), envir = helper_env)
helper_env$getIdFromCoords <- function(...) {
data.frame(
Id_station = c("1001", "1002"),
Nom_usuel = c("Station A", "Station B"),
stringsAsFactors = FALSE
)
}
helper_env$getStationData <- function(...) NULL
expect_null(
helper_env$getAllFromCoord(
coord = c(44.85, 5.84),
start_date = "2024-01-01",
end_date = "2024-01-02",
allstations = data.frame(),
headers = list(),
btw_station_sleep = 0,
within_statio_sleep = 0
)
)
})