diff --git a/.github/workflows/maven-pr.yml b/.github/workflows/maven-pr.yml new file mode 100644 index 0000000..9599779 --- /dev/null +++ b/.github/workflows/maven-pr.yml @@ -0,0 +1,20 @@ +name: Tracker CI + +on: + push: + branches: [ '!master', '**' ] + pull_request: + branches: [ '**' ] + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.11 + uses: actions/setup-java@v1 + with: + java-version: 1.11 + - name: Build with Maven + run: mvn -B clean verify --file covid-tracker/pom.xml diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index a36227e..211b5ef 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -1,23 +1,41 @@ -# This workflow will build a Java project with Maven - name: Maven CI on: push: - branches: [ '*' ] - pull_request: - branches: [ '*' ] + branches: [ 'master' ] jobs: build: - + name: Build runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 + + - name: Checkout Code + uses: actions/checkout@v2 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: Set up JDK 1.11 uses: actions/setup-java@v1 with: java-version: 1.11 + + - name: Cache SonarCloud packages + uses: actions/cache@v2 + with: + path: ~/.sonar/cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + + - name: Cache Maven packages + uses: actions/cache@v2 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + - name: Build with Maven - run: mvn -B clean package --file covid-tracker/pom.xml + run: mvn -B clean verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar --file covid-tracker/pom.xml + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/Dockerfile b/Dockerfile index fc24883..f7a689b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,8 +4,10 @@ LABEL maintainer="Subhrodip Mohanta" LABEL email="hello@subho.xyz" LABEL application="Coronavirus Tracker Application" -COPY covid-tracker/target/covid-tracker-1.2.jar /usr/local/covid-tracker/ +ARG JAR_FILE=covid-tracker/target/*.jar + +COPY ${JAR_FILE} app.jar EXPOSE 8080 -CMD ["java", "-jar", "/usr/local/covid-tracker/covid-tracker-1.2.jar"] +ENTRYPOINT [ "java", "-jar", "/app.jar" ] diff --git a/README.md b/README.md index 11dea50..c919299 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # COVID-19 Tracker -![Maven CI](https://github.com/ohbus/covid-tracker/workflows/Maven%20CI/badge.svg) [![Build Status](https://ci.subho.xyz/buildStatus/icon?job=covid-tracker+CI)](https://ci.subho.xyz/job/covid-tracker%20CI/) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/eaac0375e979405b919b2eb1cb6ddefa)](https://www.codacy.com/manual/ohbus/covid-tracker?utm_source=github.com&utm_medium=referral&utm_content=ohbus/covid-tracker&utm_campaign=Badge_Grade) +![Maven CI](https://github.com/ohbus/covid-tracker/workflows/Maven%20CI/badge.svg) ### Corona Virus Tracker Application diff --git a/covid-tracker/pom.xml b/covid-tracker/pom.xml index de2d5e7..75483e3 100644 --- a/covid-tracker/pom.xml +++ b/covid-tracker/pom.xml @@ -1,33 +1,37 @@ - 4.0.0 org.springframework.boot spring-boot-starter-parent 2.2.7.RELEASE - + + xyz.subho covid-tracker - 1.2 + 1.4 jar - - + github GitHub Subhrodip Apache Maven Packages https://maven.pkg.github.com/ohbus/covid-tracker - covid-tracker Spring Boot Project for COVID 19 Tracking - 11 + 0.8.6 + + ohbus_covid-tracker + ohbus + https://sonarcloud.io - org.springframework.boot @@ -39,11 +43,9 @@ - org.springframework.boot - spring-boot-devtools + org.springframework.boot + spring-boot-devtools - - org.springframework.boot spring-boot-starter-tomcat @@ -60,41 +62,54 @@ - - org.apache.commons - commons-csv - 1.8 + org.apache.commons + commons-csv + 1.8 + + + + org.webjars + bootstrap + 4.4.1-1 - - - - org.webjars - bootstrap - 4.4.1-1 - - - org.webjars - jquery - 3.5.1 - - org.webjars - popper.js - 2.0.2 + org.webjars + jquery + 3.5.1 + + + org.webjars + popper.js + 2.0.2 - - - org.springframework.boot spring-boot-maven-plugin + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + prepare-agent + + prepare-agent + + + + report + + report + + + + - diff --git a/covid-tracker/src/main/java/xyz/subho/covidtracker/CovidTrackerApplication.java b/covid-tracker/src/main/java/xyz/subho/covidtracker/CovidTrackerApplication.java index 0fdfe45..1fc083d 100644 --- a/covid-tracker/src/main/java/xyz/subho/covidtracker/CovidTrackerApplication.java +++ b/covid-tracker/src/main/java/xyz/subho/covidtracker/CovidTrackerApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication +@EnableScheduling public class CovidTrackerApplication { public static void main(String[] args) { diff --git a/covid-tracker/src/main/java/xyz/subho/covidtracker/client/CoronaVirusDataClient.java b/covid-tracker/src/main/java/xyz/subho/covidtracker/client/CoronaVirusDataClient.java new file mode 100644 index 0000000..6ee83e1 --- /dev/null +++ b/covid-tracker/src/main/java/xyz/subho/covidtracker/client/CoronaVirusDataClient.java @@ -0,0 +1,26 @@ +package xyz.subho.covidtracker.client; + +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +@Service +public class CoronaVirusDataClient { + + private static String VIRUS_DATA_URL = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"; + + public String getVirusData() throws IOException, InterruptedException { + HttpClient client = HttpClient.newHttpClient(); + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(VIRUS_DATA_URL)) + .build(); + + HttpResponse httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString()); + return httpResponse.body(); + } +} diff --git a/covid-tracker/src/main/java/xyz/subho/covidtracker/services/CoronaVirusDataService.java b/covid-tracker/src/main/java/xyz/subho/covidtracker/services/CoronaVirusDataService.java index 2bc5266..b7e04b2 100644 --- a/covid-tracker/src/main/java/xyz/subho/covidtracker/services/CoronaVirusDataService.java +++ b/covid-tracker/src/main/java/xyz/subho/covidtracker/services/CoronaVirusDataService.java @@ -3,25 +3,23 @@ import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVRecord; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; - +import xyz.subho.covidtracker.client.CoronaVirusDataClient; import xyz.subho.covidtracker.models.LocationStats; import javax.annotation.PostConstruct; import java.io.IOException; import java.io.StringReader; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; import java.util.ArrayList; import java.util.List; @Service public class CoronaVirusDataService { - private static String VIRUS_DATA_URL = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"; + @Autowired + private CoronaVirusDataClient coronaVirusDataClient; private List allStats = new ArrayList<>(); @@ -29,39 +27,38 @@ public List getAllStats() { return allStats; } + CoronaVirusDataService(CoronaVirusDataClient coronaVirusDataClient) + { + this.coronaVirusDataClient = coronaVirusDataClient; + } + @PostConstruct @Scheduled(cron = "0 0/30 * * * *") public void fetchVirusData() throws IOException, InterruptedException { List newStats = new ArrayList<>(); - - HttpClient client = HttpClient.newHttpClient(); - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(VIRUS_DATA_URL)) - .build(); - - HttpResponse httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString()); - - StringReader csvBodyReader = new StringReader(httpResponse.body()); - + + StringReader csvBodyReader = new StringReader(coronaVirusDataClient.getVirusData()); + Iterable records = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(csvBodyReader); - + + readCSV(newStats, records); + this.allStats = newStats; + } + + private void readCSV(List newStats, Iterable records) { for (CSVRecord record : records) { LocationStats locationStat = new LocationStats(); - + locationStat.setState(record.get("Province/State")); locationStat.setCountry(record.get("Country/Region")); - + int latestCases = Integer.parseInt(record.get(record.size() - 1)); int prevDayCases = Integer.parseInt(record.get(record.size() - 2)); - + locationStat.setLatestTotalCases(latestCases); locationStat.setDiffFromPrevDay(latestCases - prevDayCases); - + newStats.add(locationStat); } - - this.allStats = newStats; } - } diff --git a/covid-tracker/src/test/java/xyz/subho/covidtracker/controllers/MainControllerTest.java b/covid-tracker/src/test/java/xyz/subho/covidtracker/controllers/MainControllerTest.java new file mode 100644 index 0000000..2534909 --- /dev/null +++ b/covid-tracker/src/test/java/xyz/subho/covidtracker/controllers/MainControllerTest.java @@ -0,0 +1,64 @@ +package xyz.subho.covidtracker.controllers; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import xyz.subho.covidtracker.models.LocationStats; +import xyz.subho.covidtracker.services.CoronaVirusDataService; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.List; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(MainController.class) +class MainControllerTest { + @Autowired + private MockMvc mockMvc; + + @MockBean + private CoronaVirusDataService coronaVirusDataService; + + @Test + void shouldBe200AndReturnModelWhenHomeAPICalledSuccessfully() throws Exception { + ObjectMapper mapper = new ObjectMapper(); + List locationStatsList = mapper.readValue(readStatsFromFile(), new TypeReference>() { }); + when(coronaVirusDataService.getAllStats()).thenReturn(locationStatsList); + + mockMvc.perform(get("/") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(model().attribute("locationStats", locationStatsList)) + .andExpect(model().attribute("totalReportedCases", 87186540)) + .andExpect(model().attribute("totalNewCases", 780613)) + .andExpect(view().name("index")); + + verify(coronaVirusDataService, times(1)).getAllStats(); + } + + private String readStatsFromFile() + throws IOException { + StringBuilder resultStringBuilder = new StringBuilder(); + try (BufferedReader br + = new BufferedReader(new InputStreamReader(new ClassPathResource("AllStats.txt").getInputStream()))) { + String line; + while ((line = br.readLine()) != null) { + resultStringBuilder.append(line); + } + } + return resultStringBuilder.toString(); + } +} diff --git a/covid-tracker/src/test/java/xyz/subho/covidtracker/models/LocationStatsTest.java b/covid-tracker/src/test/java/xyz/subho/covidtracker/models/LocationStatsTest.java new file mode 100644 index 0000000..c41f6bb --- /dev/null +++ b/covid-tracker/src/test/java/xyz/subho/covidtracker/models/LocationStatsTest.java @@ -0,0 +1,19 @@ +package xyz.subho.covidtracker.models; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +public class LocationStatsTest { + + @Test + public void shouldBeReturningLocationStatisWithStateCountryAndLatestTotalCases(){ + LocationStats locationStats = new + LocationStats(); + locationStats.setCountry("India"); + locationStats.setLatestTotalCases(1234); + locationStats.setState("Maharastra"); + + assertThat(locationStats.toString()).isEqualTo("LocationStats{state='Maharastra', country='India', latestTotalCases=1234}"); + + } +} diff --git a/covid-tracker/src/test/java/xyz/subho/covidtracker/services/CoronaVirusDataServiceTest.java b/covid-tracker/src/test/java/xyz/subho/covidtracker/services/CoronaVirusDataServiceTest.java new file mode 100644 index 0000000..84ebd2d --- /dev/null +++ b/covid-tracker/src/test/java/xyz/subho/covidtracker/services/CoronaVirusDataServiceTest.java @@ -0,0 +1,24 @@ +package xyz.subho.covidtracker.services; + + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.io.IOException; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +public class CoronaVirusDataServiceTest { + @Autowired + private CoronaVirusDataService coronaVirusDataService; + + @Test + public void shouldBeReturningListOfLocationStats() throws IOException, InterruptedException { + coronaVirusDataService.fetchVirusData(); + + assertThat(coronaVirusDataService.getAllStats()).isNotNull(); + } + +} diff --git a/covid-tracker/src/test/java/xyz/subho/covidtracker/services/CoronaVirusDataServiceUnitTest.java b/covid-tracker/src/test/java/xyz/subho/covidtracker/services/CoronaVirusDataServiceUnitTest.java new file mode 100644 index 0000000..e716e05 --- /dev/null +++ b/covid-tracker/src/test/java/xyz/subho/covidtracker/services/CoronaVirusDataServiceUnitTest.java @@ -0,0 +1,60 @@ +package xyz.subho.covidtracker.services; + + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.io.ClassPathResource; +import org.springframework.scheduling.support.CronSequenceGenerator; +import xyz.subho.covidtracker.client.CoronaVirusDataClient; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Date; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class CoronaVirusDataServiceUnitTest { + + private CoronaVirusDataService coronaVirusDataService; + + @Mock + private CoronaVirusDataClient client ; + + @BeforeEach + void setUp() { + coronaVirusDataService = new CoronaVirusDataService(client); + } + + @Test + public void shouldBeReturningListOfLocationStats() throws IOException, InterruptedException { + when(client.getVirusData()).thenReturn(readStatsFromFile()); + + coronaVirusDataService.fetchVirusData(); + + assertThat(coronaVirusDataService.getAllStats()).isNotNull(); + } + + @Test + public void shouldBeRunningJobOnEvery30minutes() { + assertThat(new CronSequenceGenerator("0 0/30 * * * *").next(new Date(2012, 6, 1, 9, 00, 00))).isEqualTo(new Date(2012, 6, 1, 9, 30)); + } + + private String readStatsFromFile() + throws IOException { + StringBuilder resultStringBuilder = new StringBuilder(); + try (BufferedReader br + = new BufferedReader(new InputStreamReader(new ClassPathResource("HttpResponse.csv").getInputStream()))) { + String line; + while ((line = br.readLine()) != null) { + resultStringBuilder.append(line); + } + } + return resultStringBuilder.toString(); + } +} diff --git a/covid-tracker/src/test/resources/AllStats.txt b/covid-tracker/src/test/resources/AllStats.txt new file mode 100644 index 0000000..64eec3c --- /dev/null +++ b/covid-tracker/src/test/resources/AllStats.txt @@ -0,0 +1 @@ +[{"state":"","country":"Afghanistan","latestTotalCases":53105,"diffFromPrevDay":0},{"state":"","country":"Albania","latestTotalCases":61008,"diffFromPrevDay":725},{"state":"","country":"Algeria","latestTotalCases":101120,"diffFromPrevDay":247},{"state":"","country":"Andorra","latestTotalCases":8348,"diffFromPrevDay":40},{"state":"","country":"Angola","latestTotalCases":17864,"diffFromPrevDay":108},{"state":"","country":"Antigua and Barbuda","latestTotalCases":163,"diffFromPrevDay":3},{"state":"","country":"Argentina","latestTotalCases":1676171,"diffFromPrevDay":13441},{"state":"","country":"Armenia","latestTotalCases":160853,"diffFromPrevDay":309},{"state":"Australian Capital Territory","country":"Australia","latestTotalCases":118,"diffFromPrevDay":0},{"state":"New South Wales","country":"Australia","latestTotalCases":4984,"diffFromPrevDay":6},{"state":"Northern Territory","country":"Australia","latestTotalCases":87,"diffFromPrevDay":0},{"state":"Queensland","country":"Australia","latestTotalCases":1265,"diffFromPrevDay":2},{"state":"South Australia","country":"Australia","latestTotalCases":582,"diffFromPrevDay":0},{"state":"Tasmania","country":"Australia","latestTotalCases":234,"diffFromPrevDay":0},{"state":"Victoria","country":"Australia","latestTotalCases":20402,"diffFromPrevDay":0},{"state":"Western Australia","country":"Australia","latestTotalCases":874,"diffFromPrevDay":2},{"state":"","country":"Austria","latestTotalCases":372190,"diffFromPrevDay":2469},{"state":"","country":"Azerbaijan","latestTotalCases":222200,"diffFromPrevDay":799},{"state":"","country":"Bahamas","latestTotalCases":7945,"diffFromPrevDay":17},{"state":"","country":"Bahrain","latestTotalCases":94284,"diffFromPrevDay":289},{"state":"","country":"Bangladesh","latestTotalCases":518898,"diffFromPrevDay":978},{"state":"","country":"Barbados","latestTotalCases":743,"diffFromPrevDay":100},{"state":"","country":"Belarus","latestTotalCases":204958,"diffFromPrevDay":1854},{"state":"","country":"Belgium","latestTotalCases":655732,"diffFromPrevDay":2997},{"state":"","country":"Belize","latestTotalCases":11108,"diffFromPrevDay":90},{"state":"","country":"Benin","latestTotalCases":3304,"diffFromPrevDay":0},{"state":"","country":"Bhutan","latestTotalCases":755,"diffFromPrevDay":21},{"state":"","country":"Bolivia","latestTotalCases":166981,"diffFromPrevDay":1713},{"state":"","country":"Bosnia and Herzegovina","latestTotalCases":113392,"diffFromPrevDay":0},{"state":"","country":"Botswana","latestTotalCases":15440,"diffFromPrevDay":0},{"state":"","country":"Brazil","latestTotalCases":7873830,"diffFromPrevDay":63430},{"state":"","country":"Brunei","latestTotalCases":172,"diffFromPrevDay":0},{"state":"","country":"Bulgaria","latestTotalCases":206392,"diffFromPrevDay":1002},{"state":"","country":"Burkina Faso","latestTotalCases":7563,"diffFromPrevDay":221},{"state":"","country":"Burma","latestTotalCases":128178,"diffFromPrevDay":594},{"state":"","country":"Burundi","latestTotalCases":884,"diffFromPrevDay":42},{"state":"","country":"Cabo Verde","latestTotalCases":12052,"diffFromPrevDay":69},{"state":"","country":"Cambodia","latestTotalCases":385,"diffFromPrevDay":2},{"state":"","country":"Cameroon","latestTotalCases":26848,"diffFromPrevDay":0},{"state":"Alberta","country":"Canada","latestTotalCases":107501,"diffFromPrevDay":1123},{"state":"British Columbia","country":"Canada","latestTotalCases":55254,"diffFromPrevDay":625},{"state":"Diamond Princess","country":"Canada","latestTotalCases":0,"diffFromPrevDay":0},{"state":"Grand Princess","country":"Canada","latestTotalCases":13,"diffFromPrevDay":0},{"state":"Manitoba","country":"Canada","latestTotalCases":25541,"diffFromPrevDay":167},{"state":"New Brunswick","country":"Canada","latestTotalCases":693,"diffFromPrevDay":31},{"state":"Newfoundland and Labrador","country":"Canada","latestTotalCases":392,"diffFromPrevDay":0},{"state":"Northwest Territories","country":"Canada","latestTotalCases":24,"diffFromPrevDay":0},{"state":"Nova Scotia","country":"Canada","latestTotalCases":1520,"diffFromPrevDay":12},{"state":"Nunavut","country":"Canada","latestTotalCases":266,"diffFromPrevDay":0},{"state":"Ontario","country":"Canada","latestTotalCases":205283,"diffFromPrevDay":3198},{"state":"Prince Edward Island","country":"Canada","latestTotalCases":97,"diffFromPrevDay":0},{"state":"Quebec","country":"Canada","latestTotalCases":217999,"diffFromPrevDay":2641},{"state":"Repatriated Travellers","country":"Canada","latestTotalCases":13,"diffFromPrevDay":0},{"state":"Saskatchewan","country":"Canada","latestTotalCases":16804,"diffFromPrevDay":284},{"state":"Yukon","country":"Canada","latestTotalCases":66,"diffFromPrevDay":1},{"state":"","country":"Central African Republic","latestTotalCases":4963,"diffFromPrevDay":0},{"state":"","country":"Chad","latestTotalCases":2328,"diffFromPrevDay":39},{"state":"","country":"Chile","latestTotalCases":625483,"diffFromPrevDay":2382},{"state":"Anhui","country":"China","latestTotalCases":993,"diffFromPrevDay":0},{"state":"Beijing","country":"China","latestTotalCases":994,"diffFromPrevDay":0},{"state":"Chongqing","country":"China","latestTotalCases":590,"diffFromPrevDay":0},{"state":"Fujian","country":"China","latestTotalCases":518,"diffFromPrevDay":0},{"state":"Gansu","country":"China","latestTotalCases":182,"diffFromPrevDay":0},{"state":"Guangdong","country":"China","latestTotalCases":2062,"diffFromPrevDay":2},{"state":"Guangxi","country":"China","latestTotalCases":264,"diffFromPrevDay":0},{"state":"Guizhou","country":"China","latestTotalCases":147,"diffFromPrevDay":0},{"state":"Hainan","country":"China","latestTotalCases":171,"diffFromPrevDay":0},{"state":"Hebei","country":"China","latestTotalCases":465,"diffFromPrevDay":53},{"state":"Heilongjiang","country":"China","latestTotalCases":970,"diffFromPrevDay":0},{"state":"Henan","country":"China","latestTotalCases":1300,"diffFromPrevDay":0},{"state":"Hong Kong","country":"China","latestTotalCases":9074,"diffFromPrevDay":25},{"state":"Hubei","country":"China","latestTotalCases":68149,"diffFromPrevDay":0},{"state":"Hunan","country":"China","latestTotalCases":1021,"diffFromPrevDay":0},{"state":"Inner Mongolia","country":"China","latestTotalCases":366,"diffFromPrevDay":0},{"state":"Jiangsu","country":"China","latestTotalCases":685,"diffFromPrevDay":0},{"state":"Jiangxi","country":"China","latestTotalCases":935,"diffFromPrevDay":0},{"state":"Jilin","country":"China","latestTotalCases":157,"diffFromPrevDay":0},{"state":"Liaoning","country":"China","latestTotalCases":374,"diffFromPrevDay":1},{"state":"Macau","country":"China","latestTotalCases":46,"diffFromPrevDay":0},{"state":"Ningxia","country":"China","latestTotalCases":75,"diffFromPrevDay":0},{"state":"Qinghai","country":"China","latestTotalCases":18,"diffFromPrevDay":0},{"state":"Shaanxi","country":"China","latestTotalCases":521,"diffFromPrevDay":2},{"state":"Shandong","country":"China","latestTotalCases":863,"diffFromPrevDay":0},{"state":"Shanghai","country":"China","latestTotalCases":1543,"diffFromPrevDay":5},{"state":"Shanxi","country":"China","latestTotalCases":225,"diffFromPrevDay":0},{"state":"Sichuan","country":"China","latestTotalCases":857,"diffFromPrevDay":0},{"state":"Tianjin","country":"China","latestTotalCases":316,"diffFromPrevDay":0},{"state":"Tibet","country":"China","latestTotalCases":1,"diffFromPrevDay":0},{"state":"Xinjiang","country":"China","latestTotalCases":980,"diffFromPrevDay":0},{"state":"Yunnan","country":"China","latestTotalCases":230,"diffFromPrevDay":0},{"state":"Zhejiang","country":"China","latestTotalCases":1306,"diffFromPrevDay":0},{"state":"","country":"Colombia","latestTotalCases":1719771,"diffFromPrevDay":16805},{"state":"","country":"Comoros","latestTotalCases":995,"diffFromPrevDay":0},{"state":"","country":"Congo (Brazzaville)","latestTotalCases":7127,"diffFromPrevDay":20},{"state":"","country":"Congo (Kinshasa)","latestTotalCases":18487,"diffFromPrevDay":239},{"state":"","country":"Costa Rica","latestTotalCases":175038,"diffFromPrevDay":1447},{"state":"","country":"Cote d'Ivoire","latestTotalCases":22963,"diffFromPrevDay":108},{"state":"","country":"Croatia","latestTotalCases":216286,"diffFromPrevDay":1896},{"state":"","country":"Cuba","latestTotalCases":13165,"diffFromPrevDay":201},{"state":"","country":"Cyprus","latestTotalCases":25781,"diffFromPrevDay":573},{"state":"","country":"Czechia","latestTotalCases":776967,"diffFromPrevDay":17332},{"state":"Faroe Islands","country":"Denmark","latestTotalCases":640,"diffFromPrevDay":14},{"state":"Greenland","country":"Denmark","latestTotalCases":28,"diffFromPrevDay":0},{"state":"","country":"Denmark","latestTotalCases":174995,"diffFromPrevDay":2216},{"state":"","country":"Diamond Princess","latestTotalCases":712,"diffFromPrevDay":0},{"state":"","country":"Djibouti","latestTotalCases":5855,"diffFromPrevDay":1},{"state":"","country":"Dominica","latestTotalCases":105,"diffFromPrevDay":17},{"state":"","country":"Dominican Republic","latestTotalCases":176378,"diffFromPrevDay":529},{"state":"","country":"Ecuador","latestTotalCases":217377,"diffFromPrevDay":1294},{"state":"","country":"Egypt","latestTotalCases":145590,"diffFromPrevDay":1007},{"state":"","country":"El Salvador","latestTotalCases":47355,"diffFromPrevDay":0},{"state":"","country":"Equatorial Guinea","latestTotalCases":5286,"diffFromPrevDay":7},{"state":"","country":"Eritrea","latestTotalCases":1252,"diffFromPrevDay":0},{"state":"","country":"Estonia","latestTotalCases":30667,"diffFromPrevDay":717},{"state":"","country":"Eswatini","latestTotalCases":10539,"diffFromPrevDay":201},{"state":"","country":"Ethiopia","latestTotalCases":126786,"diffFromPrevDay":545},{"state":"","country":"Fiji","latestTotalCases":53,"diffFromPrevDay":0},{"state":"","country":"Finland","latestTotalCases":37549,"diffFromPrevDay":331},{"state":"French Guiana","country":"France","latestTotalCases":13497,"diffFromPrevDay":123},{"state":"French Polynesia","country":"France","latestTotalCases":17131,"diffFromPrevDay":43},{"state":"Guadeloupe","country":"France","latestTotalCases":8702,"diffFromPrevDay":0},{"state":"Martinique","country":"France","latestTotalCases":6117,"diffFromPrevDay":0},{"state":"Mayotte","country":"France","latestTotalCases":6045,"diffFromPrevDay":0},{"state":"New Caledonia","country":"France","latestTotalCases":40,"diffFromPrevDay":0},{"state":"Reunion","country":"France","latestTotalCases":9118,"diffFromPrevDay":0},{"state":"Saint Barthelemy","country":"France","latestTotalCases":206,"diffFromPrevDay":16},{"state":"Saint Pierre and Miquelon","country":"France","latestTotalCases":16,"diffFromPrevDay":0},{"state":"St Martin","country":"France","latestTotalCases":1025,"diffFromPrevDay":30},{"state":"Wallis and Futuna","country":"France","latestTotalCases":4,"diffFromPrevDay":0},{"state":"","country":"France","latestTotalCases":2701215,"diffFromPrevDay":25020},{"state":"","country":"Gabon","latestTotalCases":9641,"diffFromPrevDay":36},{"state":"","country":"Gambia","latestTotalCases":3812,"diffFromPrevDay":0},{"state":"","country":"Georgia","latestTotalCases":233879,"diffFromPrevDay":1800},{"state":"","country":"Germany","latestTotalCases":1841228,"diffFromPrevDay":26663},{"state":"","country":"Ghana","latestTotalCases":55168,"diffFromPrevDay":0},{"state":"","country":"Greece","latestTotalCases":142267,"diffFromPrevDay":814},{"state":"","country":"Grenada","latestTotalCases":127,"diffFromPrevDay":0},{"state":"","country":"Guatemala","latestTotalCases":140202,"diffFromPrevDay":783},{"state":"","country":"Guinea","latestTotalCases":13845,"diffFromPrevDay":0},{"state":"","country":"Guinea-Bissau","latestTotalCases":2455,"diffFromPrevDay":0},{"state":"","country":"Guyana","latestTotalCases":6407,"diffFromPrevDay":0},{"state":"","country":"Haiti","latestTotalCases":10127,"diffFromPrevDay":0},{"state":"","country":"Holy See","latestTotalCases":27,"diffFromPrevDay":0},{"state":"","country":"Honduras","latestTotalCases":124899,"diffFromPrevDay":1077},{"state":"","country":"Hungary","latestTotalCases":331768,"diffFromPrevDay":2047},{"state":"","country":"Iceland","latestTotalCases":5832,"diffFromPrevDay":21},{"state":"","country":"India","latestTotalCases":10395278,"diffFromPrevDay":20346},{"state":"","country":"Indonesia","latestTotalCases":788402,"diffFromPrevDay":8854},{"state":"","country":"Iran","latestTotalCases":1261903,"diffFromPrevDay":6283},{"state":"","country":"Iraq","latestTotalCases":599965,"diffFromPrevDay":839},{"state":"","country":"Ireland","latestTotalCases":121154,"diffFromPrevDay":7832},{"state":"","country":"Israel","latestTotalCases":463448,"diffFromPrevDay":7309},{"state":"","country":"Italy","latestTotalCases":2201945,"diffFromPrevDay":20326},{"state":"","country":"Jamaica","latestTotalCases":13330,"diffFromPrevDay":84},{"state":"","country":"Japan","latestTotalCases":259521,"diffFromPrevDay":5950},{"state":"","country":"Jordan","latestTotalCases":302856,"diffFromPrevDay":1553},{"state":"","country":"Kazakhstan","latestTotalCases":205933,"diffFromPrevDay":869},{"state":"","country":"Kenya","latestTotalCases":97398,"diffFromPrevDay":271},{"state":"","country":"Korea, South","latestTotalCases":66686,"diffFromPrevDay":868},{"state":"","country":"Kosovo","latestTotalCases":52333,"diffFromPrevDay":0},{"state":"","country":"Kuwait","latestTotalCases":152438,"diffFromPrevDay":411},{"state":"","country":"Kyrgyzstan","latestTotalCases":81656,"diffFromPrevDay":144},{"state":"","country":"Laos","latestTotalCases":41,"diffFromPrevDay":0},{"state":"","country":"Latvia","latestTotalCases":45171,"diffFromPrevDay":1229},{"state":"","country":"Lebanon","latestTotalCases":199925,"diffFromPrevDay":4166},{"state":"","country":"Lesotho","latestTotalCases":4137,"diffFromPrevDay":931},{"state":"","country":"Liberia","latestTotalCases":1779,"diffFromPrevDay":0},{"state":"","country":"Libya","latestTotalCases":102880,"diffFromPrevDay":424},{"state":"","country":"Liechtenstein","latestTotalCases":2295,"diffFromPrevDay":49},{"state":"","country":"Lithuania","latestTotalCases":152215,"diffFromPrevDay":2718},{"state":"","country":"Luxembourg","latestTotalCases":47430,"diffFromPrevDay":281},{"state":"","country":"MS Zaandam","latestTotalCases":9,"diffFromPrevDay":0},{"state":"","country":"Madagascar","latestTotalCases":17767,"diffFromPrevDay":0},{"state":"","country":"Malawi","latestTotalCases":7337,"diffFromPrevDay":227},{"state":"","country":"Malaysia","latestTotalCases":125438,"diffFromPrevDay":2593},{"state":"","country":"Maldives","latestTotalCases":13967,"diffFromPrevDay":37},{"state":"","country":"Mali","latestTotalCases":7395,"diffFromPrevDay":46},{"state":"","country":"Malta","latestTotalCases":13612,"diffFromPrevDay":224},{"state":"","country":"Marshall Islands","latestTotalCases":4,"diffFromPrevDay":0},{"state":"","country":"Mauritania","latestTotalCases":15111,"diffFromPrevDay":130},{"state":"","country":"Mauritius","latestTotalCases":539,"diffFromPrevDay":8},{"state":"","country":"Mexico","latestTotalCases":1479835,"diffFromPrevDay":13345},{"state":"","country":"Moldova","latestTotalCases":147871,"diffFromPrevDay":950},{"state":"","country":"Monaco","latestTotalCases":978,"diffFromPrevDay":31},{"state":"","country":"Mongolia","latestTotalCases":1308,"diffFromPrevDay":0},{"state":"","country":"Montenegro","latestTotalCases":50697,"diffFromPrevDay":643},{"state":"","country":"Morocco","latestTotalCases":447081,"diffFromPrevDay":1642},{"state":"","country":"Mozambique","latestTotalCases":19667,"diffFromPrevDay":125},{"state":"","country":"Namibia","latestTotalCases":26319,"diffFromPrevDay":432},{"state":"","country":"Nepal","latestTotalCases":263193,"diffFromPrevDay":409},{"state":"Aruba","country":"Netherlands","latestTotalCases":5811,"diffFromPrevDay":95},{"state":"Bonaire, Sint Eustatius and Saba","country":"Netherlands","latestTotalCases":196,"diffFromPrevDay":0},{"state":"Curacao","country":"Netherlands","latestTotalCases":4378,"diffFromPrevDay":36},{"state":"Sint Maarten","country":"Netherlands","latestTotalCases":1512,"diffFromPrevDay":8},{"state":"","country":"Netherlands","latestTotalCases":841163,"diffFromPrevDay":7099},{"state":"","country":"New Zealand","latestTotalCases":2188,"diffFromPrevDay":2},{"state":"","country":"Nicaragua","latestTotalCases":6097,"diffFromPrevDay":0},{"state":"","country":"Niger","latestTotalCases":3634,"diffFromPrevDay":134},{"state":"","country":"Nigeria","latestTotalCases":94369,"diffFromPrevDay":1664},{"state":"","country":"North Macedonia","latestTotalCases":85328,"diffFromPrevDay":619},{"state":"","country":"Norway","latestTotalCases":52967,"diffFromPrevDay":787},{"state":"","country":"Oman","latestTotalCases":129888,"diffFromPrevDay":114},{"state":"","country":"Pakistan","latestTotalCases":495075,"diffFromPrevDay":2481},{"state":"","country":"Panama","latestTotalCases":264956,"diffFromPrevDay":5186},{"state":"","country":"Papua New Guinea","latestTotalCases":799,"diffFromPrevDay":0},{"state":"","country":"Paraguay","latestTotalCases":111694,"diffFromPrevDay":898},{"state":"","country":"Peru","latestTotalCases":1022018,"diffFromPrevDay":2543},{"state":"","country":"Philippines","latestTotalCases":480737,"diffFromPrevDay":1044},{"state":"","country":"Poland","latestTotalCases":1344763,"diffFromPrevDay":14220},{"state":"","country":"Portugal","latestTotalCases":446606,"diffFromPrevDay":10027},{"state":"","country":"Qatar","latestTotalCases":145061,"diffFromPrevDay":209},{"state":"","country":"Romania","latestTotalCases":654007,"diffFromPrevDay":5719},{"state":"","country":"Russia","latestTotalCases":3274615,"diffFromPrevDay":23902},{"state":"","country":"Rwanda","latestTotalCases":9058,"diffFromPrevDay":103},{"state":"","country":"Saint Kitts and Nevis","latestTotalCases":33,"diffFromPrevDay":0},{"state":"","country":"Saint Lucia","latestTotalCases":382,"diffFromPrevDay":2},{"state":"","country":"Saint Vincent and the Grenadines","latestTotalCases":149,"diffFromPrevDay":16},{"state":"","country":"Samoa","latestTotalCases":2,"diffFromPrevDay":0},{"state":"","country":"San Marino","latestTotalCases":2549,"diffFromPrevDay":0},{"state":"","country":"Sao Tome and Principe","latestTotalCases":1025,"diffFromPrevDay":1},{"state":"","country":"Saudi Arabia","latestTotalCases":363377,"diffFromPrevDay":118},{"state":"","country":"Senegal","latestTotalCases":20156,"diffFromPrevDay":192},{"state":"","country":"Serbia","latestTotalCases":352120,"diffFromPrevDay":2882},{"state":"","country":"Seychelles","latestTotalCases":313,"diffFromPrevDay":0},{"state":"","country":"Sierra Leone","latestTotalCases":2739,"diffFromPrevDay":15},{"state":"","country":"Singapore","latestTotalCases":58780,"diffFromPrevDay":31},{"state":"","country":"Slovakia","latestTotalCases":196047,"diffFromPrevDay":4959},{"state":"","country":"Slovenia","latestTotalCases":131724,"diffFromPrevDay":3354},{"state":"","country":"Solomon Islands","latestTotalCases":17,"diffFromPrevDay":0},{"state":"","country":"Somalia","latestTotalCases":4726,"diffFromPrevDay":12},{"state":"","country":"South Africa","latestTotalCases":1149591,"diffFromPrevDay":21832},{"state":"","country":"South Sudan","latestTotalCases":3589,"diffFromPrevDay":0},{"state":"","country":"Spain","latestTotalCases":1982544,"diffFromPrevDay":0},{"state":"","country":"Sri Lanka","latestTotalCases":46248,"diffFromPrevDay":522},{"state":"","country":"Sudan","latestTotalCases":23316,"diffFromPrevDay":0},{"state":"","country":"Suriname","latestTotalCases":6666,"diffFromPrevDay":80},{"state":"","country":"Sweden","latestTotalCases":469748,"diffFromPrevDay":0},{"state":"","country":"Switzerland","latestTotalCases":470789,"diffFromPrevDay":4808},{"state":"","country":"Syria","latestTotalCases":11988,"diffFromPrevDay":98},{"state":"","country":"Taiwan*","latestTotalCases":819,"diffFromPrevDay":2},{"state":"","country":"Tajikistan","latestTotalCases":13305,"diffFromPrevDay":0},{"state":"","country":"Tanzania","latestTotalCases":509,"diffFromPrevDay":0},{"state":"","country":"Thailand","latestTotalCases":9636,"diffFromPrevDay":305},{"state":"","country":"Timor-Leste","latestTotalCases":49,"diffFromPrevDay":0},{"state":"","country":"Togo","latestTotalCases":3807,"diffFromPrevDay":37},{"state":"","country":"Trinidad and Tobago","latestTotalCases":7196,"diffFromPrevDay":10},{"state":"","country":"Tunisia","latestTotalCases":149881,"diffFromPrevDay":2820},{"state":"","country":"Turkey","latestTotalCases":2283931,"diffFromPrevDay":13830},{"state":"","country":"US","latestTotalCases":21299340,"diffFromPrevDay":253145},{"state":"","country":"Uganda","latestTotalCases":36702,"diffFromPrevDay":295},{"state":"","country":"Ukraine","latestTotalCases":1124482,"diffFromPrevDay":7226},{"state":"","country":"United Arab Emirates","latestTotalCases":218766,"diffFromPrevDay":2067},{"state":"Anguilla","country":"United Kingdom","latestTotalCases":15,"diffFromPrevDay":0},{"state":"Bermuda","country":"United Kingdom","latestTotalCases":632,"diffFromPrevDay":0},{"state":"British Virgin Islands","country":"United Kingdom","latestTotalCases":97,"diffFromPrevDay":0},{"state":"Cayman Islands","country":"United Kingdom","latestTotalCases":356,"diffFromPrevDay":6},{"state":"Channel Islands","country":"United Kingdom","latestTotalCases":3194,"diffFromPrevDay":30},{"state":"Falkland Islands (Malvinas)","country":"United Kingdom","latestTotalCases":29,"diffFromPrevDay":0},{"state":"Gibraltar","country":"United Kingdom","latestTotalCases":2798,"diffFromPrevDay":172},{"state":"Isle of Man","country":"United Kingdom","latestTotalCases":389,"diffFromPrevDay":3},{"state":"Montserrat","country":"United Kingdom","latestTotalCases":13,"diffFromPrevDay":0},{"state":"Turks and Caicos Islands","country":"United Kingdom","latestTotalCases":941,"diffFromPrevDay":23},{"state":"","country":"United Kingdom","latestTotalCases":2836801,"diffFromPrevDay":62322},{"state":"","country":"Uruguay","latestTotalCases":23048,"diffFromPrevDay":944},{"state":"","country":"Uzbekistan","latestTotalCases":77350,"diffFromPrevDay":55},{"state":"","country":"Vanuatu","latestTotalCases":1,"diffFromPrevDay":0},{"state":"","country":"Venezuela","latestTotalCases":114908,"diffFromPrevDay":246},{"state":"","country":"Vietnam","latestTotalCases":1505,"diffFromPrevDay":1},{"state":"","country":"West Bank and Gaza","latestTotalCases":144257,"diffFromPrevDay":1088},{"state":"","country":"Yemen","latestTotalCases":2102,"diffFromPrevDay":1},{"state":"","country":"Zambia","latestTotalCases":23495,"diffFromPrevDay":850},{"state":"","country":"Zimbabwe","latestTotalCases":17804,"diffFromPrevDay":610}] \ No newline at end of file diff --git a/covid-tracker/src/test/resources/HttpResponse.csv b/covid-tracker/src/test/resources/HttpResponse.csv new file mode 100644 index 0000000..0df8f30 --- /dev/null +++ b/covid-tracker/src/test/resources/HttpResponse.csv @@ -0,0 +1,9 @@ +Province/State,Country/Region,Lat,Long,1/22/20,1/23/20,1/24/20,1/25/20,1/26/20,1/27/20,1/28/20,1/29/20,1/30/20,1/31/20,2/1/20,2/2/20,2/3/20,2/4/20,2/5/20,2/6/20,2/7/20,2/8/20,2/9/20,2/10/20,2/11/20,2/12/20,2/13/20,2/14/20,2/15/20,2/16/20,2/17/20,2/18/20,2/19/20,2/20/20,2/21/20,2/22/20,2/23/20,2/24/20,2/25/20,2/26/20,2/27/20,2/28/20,2/29/20,3/1/20,3/2/20,3/3/20,3/4/20,3/5/20,3/6/20,3/7/20,3/8/20,3/9/20,3/10/20,3/11/20,3/12/20,3/13/20,3/14/20,3/15/20,3/16/20,3/17/20,3/18/20,3/19/20,3/20/20,3/21/20,3/22/20,3/23/20,3/24/20,3/25/20,3/26/20,3/27/20,3/28/20,3/29/20,3/30/20,3/31/20,4/1/20,4/2/20,4/3/20,4/4/20,4/5/20,4/6/20,4/7/20,4/8/20,4/9/20,4/10/20,4/11/20,4/12/20,4/13/20,4/14/20,4/15/20,4/16/20,4/17/20,4/18/20,4/19/20,4/20/20,4/21/20,4/22/20,4/23/20,4/24/20,4/25/20,4/26/20,4/27/20,4/28/20,4/29/20,4/30/20,5/1/20,5/2/20,5/3/20,5/4/20,5/5/20,5/6/20,5/7/20,5/8/20,5/9/20,5/10/20,5/11/20,5/12/20,5/13/20,5/14/20,5/15/20,5/16/20,5/17/20,5/18/20,5/19/20,5/20/20,5/21/20,5/22/20,5/23/20,5/24/20,5/25/20,5/26/20,5/27/20,5/28/20,5/29/20,5/30/20,5/31/20,6/1/20,6/2/20,6/3/20,6/4/20,6/5/20,6/6/20,6/7/20,6/8/20,6/9/20,6/10/20,6/11/20,6/12/20,6/13/20,6/14/20,6/15/20,6/16/20,6/17/20,6/18/20,6/19/20,6/20/20,6/21/20,6/22/20,6/23/20,6/24/20,6/25/20,6/26/20,6/27/20,6/28/20,6/29/20,6/30/20,7/1/20,7/2/20,7/3/20,7/4/20,7/5/20,7/6/20,7/7/20,7/8/20,7/9/20,7/10/20,7/11/20,7/12/20,7/13/20,7/14/20,7/15/20,7/16/20,7/17/20,7/18/20,7/19/20,7/20/20,7/21/20,7/22/20,7/23/20,7/24/20,7/25/20,7/26/20,7/27/20,7/28/20,7/29/20,7/30/20,7/31/20,8/1/20,8/2/20,8/3/20,8/4/20,8/5/20,8/6/20,8/7/20,8/8/20,8/9/20,8/10/20,8/11/20,8/12/20,8/13/20,8/14/20,8/15/20,8/16/20,8/17/20,8/18/20,8/19/20,8/20/20,8/21/20,8/22/20,8/23/20,8/24/20,8/25/20,8/26/20,8/27/20,8/28/20,8/29/20,8/30/20,8/31/20,9/1/20,9/2/20,9/3/20,9/4/20,9/5/20,9/6/20,9/7/20,9/8/20,9/9/20,9/10/20,9/11/20,9/12/20,9/13/20,9/14/20,9/15/20,9/16/20,9/17/20,9/18/20,9/19/20,9/20/20,9/21/20,9/22/20,9/23/20,9/24/20,9/25/20,9/26/20,9/27/20,9/28/20,9/29/20,9/30/20,10/1/20,10/2/20,10/3/20,10/4/20,10/5/20,10/6/20,10/7/20,10/8/20,10/9/20,10/10/20,10/11/20,10/12/20,10/13/20,10/14/20,10/15/20,10/16/20,10/17/20,10/18/20,10/19/20,10/20/20,10/21/20,10/22/20,10/23/20,10/24/20,10/25/20,10/26/20,10/27/20,10/28/20,10/29/20,10/30/20,10/31/20,11/1/20,11/2/20,11/3/20,11/4/20,11/5/20,11/6/20,11/7/20,11/8/20,11/9/20,11/10/20,11/11/20,11/12/20,11/13/20,11/14/20,11/15/20,11/16/20,11/17/20,11/18/20,11/19/20,11/20/20,11/21/20,11/22/20,11/23/20,11/24/20,11/25/20,11/26/20,11/27/20,11/28/20,11/29/20,11/30/20,12/1/20,12/2/20,12/3/20,12/4/20,12/5/20,12/6/20,12/7/20,12/8/20,12/9/20,12/10/20,12/11/20,12/12/20,12/13/20,12/14/20,12/15/20,12/16/20,12/17/20,12/18/20,12/19/20,12/20/20,12/21/20,12/22/20,12/23/20,12/24/20,12/25/20,12/26/20,12/27/20,12/28/20,12/29/20,12/30/20,12/31/20,1/1/21,1/2/21,1/3/21,1/4/21,1/5/21,1/6/21 +Australian Capital Territory,Australia,-35.4735,149.0124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,3,4,6,9,19,32,39,39,53,62,71,77,78,80,84,87,91,93,96,96,96,99,100,103,103,103,102,103,103,103,103,103,103,104,104,104,104,105,106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,111,112,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,115,115,115,115,115,115,115,115,115,116,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118 +New South Wales,Australia,-33.8688,151.2093,0,0,0,0,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,6,13,22,22,26,28,38,48,55,65,65,92,112,134,171,210,267,307,353,436,669,669,818,1029,1219,1405,1617,1791,2032,2032,2182,2298,2389,2493,2580,2637,2686,2734,2773,2822,2857,2857,2863,2870,2886,2897,2926,2936,2957,2963,2969,2971,2976,2982,2994,3002,3004,3016,3016,3025,3030,3035,3033,3035,3042,3044,3047,3051,3053,3053,3053,3059,3063,3071,3074,3075,3076,3078,3081,3082,3084,3086,3087,3090,3092,3089,3090,3092,3092,3095,3098,3104,3104,3106,3110,3110,3109,3112,3114,3117,3117,3115,3119,3128,3131,3134,3135,3137,3143,3144,3149,3151,3150,3159,3162,3168,3174,3177,3184,3189,3203,3211,3211,3405,3419,3429,3433,3440,3453,3467,3474,3478,3492,3505,3517,3527,3535,3550,3568,3588,3599,3614,3633,3640,3654,3668,3685,3699,3718,3736,3756,3773,3784,3797,3809,3820,3832,3842,3851,3861,3875,3897,3915,3927,3936,3945,3950,3957,3959,3966,3971,3972,3981,3985,3988,3991,3997,4006,4019,4033,4040,4050,4063,4079,4091,4099,4104,4114,4118,4126,4135,4142,4152,4157,4166,4170,4177,4185,4190,4196,4198,4200,4204,4206,4212,4213,4217,4218,4218,4218,4220,4224,4227,4231,4232,4234,4235,4246,4249,4261,4271,4273,4278,4284,4295,4310,4321,4326,4333,4338,4342,4347,4357,4363,4370,4375,4382,4386,4398,4406,4411,4417,4421,4425,4432,4435,4443,4445,4454,4459,4462,4469,4469,4469,4469,4469,4469,4486,4498,4502,4509,4514,4517,4527,4538,4542,4548,4552,4552,4556,4564,4568,4577,4582,4588,4597,4603,4605,4610,4614,4620,4622,4624,4633,4639,4642,4645,4650,4657,4666,4682,4712,4748,4771,4789,4805,4823,4832,4847,4858,4872,4881,4906,4923,4928,4947,4958,4965,4973,4978,4984 +Northern Territory,Australia,-12.4634,130.8456,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,3,3,5,5,6,6,12,12,15,15,15,17,19,21,22,26,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,27,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,37,37,38,38,38,38,38,39,39,39,39,39,40,41,42,42,46,46,46,46,46,46,46,46,46,46,47,48,49,52,52,52,52,53,53,59,59,59,59,59,61,61,61,62,62,62,63,66,66,68,68,69,71,71,71,71,73,73,73,73,73,74,74,74,75,75,81,81,81,87,87 +Queensland,Australia,-27.4698,153.0251,0,0,0,0,0,0,0,1,3,2,3,2,2,3,3,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,9,11,11,13,13,13,15,15,18,20,20,35,46,61,68,78,94,144,184,221,259,319,397,443,493,555,625,656,689,743,781,835,873,900,907,921,934,943,953,965,974,983,987,998,999,1001,1007,1015,1019,1019,1024,1024,1026,1026,1026,1030,1033,1034,1033,1033,1034,1035,1038,1043,1043,1045,1045,1045,1045,1045,1051,1052,1051,1054,1055,1055,1057,1057,1058,1058,1058,1060,1061,1056,1057,1058,1058,1058,1058,1058,1058,1059,1059,1060,1060,1061,1061,1062,1062,1062,1063,1064,1065,1065,1065,1065,1066,1066,1066,1066,1066,1066,1066,1066,1066,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1067,1068,1068,1068,1068,1070,1070,1071,1071,1071,1071,1071,1071,1071,1072,1072,1073,1074,1076,1076,1076,1076,1076,1078,1082,1083,1084,1085,1085,1085,1088,1088,1087,1088,1088,1089,1089,1089,1089,1091,1091,1091,1091,1091,1092,1093,1094,1103,1105,1106,1106,1107,1110,1113,1117,1121,1122,1124,1126,1128,1128,1129,1131,1133,1134,1143,1143,1145,1149,1149,1149,1150,1149,1150,1150,1150,1152,1153,1153,1153,1153,1153,1156,1157,1157,1157,1157,1157,1160,1160,1160,1160,1160,1160,1160,1160,1161,1161,1161,1161,1161,1162,1164,1164,1164,1164,1164,1165,1165,1167,1167,1167,1167,1167,1169,1169,1172,1171,1172,1172,1175,1177,1177,1177,1177,1177,1177,1178,1179,1182,1183,1185,1185,1185,1186,1187,1190,1190,1192,1193,1196,1197,1197,1197,1198,1199,1201,1201,1202,1205,1206,1208,1210,1212,1215,1221,1221,1225,1224,1226,1226,1227,1228,1229,1230,1233,1232,1234,1235,1235,1236,1238,1240,1241,1241,1246,1248,1250,1253,1253,1255,1255,1260,1262,1263,1265 +South Australia,Australia,-34.9285,138.6007,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,5,5,7,7,7,7,7,9,9,16,19,20,29,29,37,42,50,67,100,134,170,170,235,257,287,299,305,337,367,367,396,407,407,411,411,415,420,428,429,429,429,433,433,433,435,435,435,435,437,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,440,443,443,443,443,443,443,443,443,443,443,443,443,443,443,443,443,444,444,444,444,444,444,444,446,447,447,447,447,447,448,448,449,451,453,455,457,457,456,459,459,459,459,459,459,459,460,460,460,461,462,462,462,462,462,462,463,463,463,463,463,463,463,463,463,463,463,463,463,464,464,464,465,465,465,466,466,466,466,466,466,466,466,466,466,466,466,468,468,468,468,468,468,468,468,468,470,470,471,471,472,472,472,473,473,475,475,476,479,479,479,482,484,484,484,485,485,487,487,491,494,494,495,496,497,501,501,503,504,509,510,512,515,515,517,517,517,517,517,522,544,547,551,551,553,554,555,556,557,558,560,559,562,561,562,562,562,562,562,562,562,562,562,562,562,562,562,562,563,563,563,563,563,563,563,566,566,566,568,568,569,569,572,572,575,576,580,580,580,583,581,582,582 +Tasmania,Australia,-42.8821,147.3272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,3,3,5,5,6,7,7,10,10,10,16,22,28,28,36,47,47,62,66,66,69,69,72,74,80,82,86,89,98,111,122,133,133,144,165,165,169,180,188,195,200,201,205,207,207,207,212,214,218,219,221,221,221,221,221,225,226,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,231,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,233,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234 +Victoria,Australia,-37.8136,144.9631,0,0,0,0,1,1,1,1,2,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,7,7,9,9,10,10,10,11,11,15,18,21,21,36,49,57,71,94,121,121,121,229,355,355,411,466,520,574,685,769,821,917,968,1036,1085,1115,1135,1158,1191,1212,1228,1241,1265,1268,1281,1291,1299,1299,1302,1319,1328,1329,1336,1336,1337,1343,1346,1349,1349,1354,1361,1364,1371,1384,1406,1423,1440,1454,1467,1468,1487,1496,1511,1514,1521,1540,1551,1558,1564,1573,1573,1581,1593,1593,1603,1605,1610,1618,1628,1634,1645,1649,1653,1663,1670,1678,1681,1681,1685,1687,1687,1691,1699,1703,1703,1720,1732,1741,1762,1780,1792,1792,1836,1847,1864,1884,1917,1947,1947,2028,2099,2159,2231,2303,2368,2368,2536,2660,2824,2942,3098,3397,3560,3799,3967,4224,4448,4750,5165,5353,5696,5942,6289,6739,7125,7405,7744,8181,8696,9049,9304,9998,10577,10931,11557,11937,12335,13035,13469,13867,14283,14659,14957,15251,15646,15863,16234,16517,16764,17027,17238,17446,17683,17852,18029,18231,18330,18464,18608,18714,18822,18903,19015,19080,19138,19224,19336,19415,19479,19538,19574,19615,19688,19739,19767,19800,19835,19872,19911,19943,19970,20012,20034,20042,20051,20076,20100,20105,20118,20130,20145,20149,20158,20169,20183,20189,20197,20209,20220,20233,20237,20247,20257,20269,20281,20295,20307,20311,20315,20317,20317,20319,20319,20320,20323,20329,20330,20336,20343,20342,20341,20342,20344,20347,20347,20346,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20345,20350,20351,20352,20352,20352,20351,20352,20354,20356,20357,20360,20361,20361,20361,20361,20362,20364,20364,20365,20368,20376,20388,20391,20395,20399,20402,20402 +Western Australia,Australia,-31.9505,115.8605,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,3,3,3,3,4,6,9,9,14,17,17,28,31,35,52,64,90,120,140,175,175,231,231,278,311,355,364,392,400,400,436,453,460,460,481,495,506,514,514,517,527,527,532,541,544,545,545,546,546,546,548,549,549,549,550,551,551,551,551,551,551,551,551,552,552,552,552,553,553,552,552,552,553,554,557,557,557,557,557,560,560,564,570,570,577,585,586,589,591,592,592,592,596,599,599,599,599,601,602,602,602,602,602,602,603,603,604,605,605,607,607,608,608,608,609,609,611,611,611,611,611,612,618,621,624,624,627,634,635,635,636,636,646,646,651,651,651,651,651,651,654,656,658,658,659,661,661,665,666,641,669,669,670,670,642,642,642,642,642,642,644,645,646,646,646,647,647,651,651,651,652,652,653,653,653,655,655,655,655,655,655,655,655,655,655,656,658,658,659,659,659,659,659,659,659,661,661,661,662,662,665,665,665,668,668,676,676,676,684,685,685,686,686,686,687,687,690,690,692,694,694,696,703,704,709,709,711,714,714,738,739,747,753,757,762,762,765,765,766,767,769,769,770,771,771,775,776,776,776,776,776,776,776,776,783,787,788,794,794,796,797,799,804,804,808,817,817,817,818,818,821,823,823,825,828,830,830,831,832,832,834,835,836,836,838,842,843,844,845,845,846,846,846,847,848,854,853,858,858,859,859,861,863,867,868,869,872,874