blob: 92628d9b0a938e20778759cf537828576b71f89f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.plc4x.java.scraper;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
import org.apache.plc4x.java.scraper.config.JobConfiguration;
import org.apache.plc4x.java.scraper.config.ScraperConfiguration;
import org.assertj.core.api.WithAssertions;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
import java.io.IOException;
import java.util.List;
@ExtendWith(MockitoExtension.class)
class ScraperConfigurationTest implements WithAssertions {
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
@Test
void parseJobs_fromString() throws IOException {
String yaml = "sources:\n" +
" a1: b\n" +
" a2: b\n" +
" a3: b\n" +
"jobs:\n" +
" - name: job1\n" +
" scrapeRate: 10\n" +
" sources:\n" +
" - a1\n" +
" - a2\n" +
" - a3\n" +
" fields:\n" +
" a: DBasdf\n" +
" b: DBbsdf\n";
ScraperConfiguration configuration = mapper.readValue(yaml, ScraperConfiguration.class);
assertThat(configuration.getJobConfigurations()).hasSize(1);
JobConfiguration conf = configuration.getJobConfigurations().get(0);
assertThat(configuration.getSources())
.isNotEmpty()
.hasSize(3)
.containsEntry("a1", "b")
.containsEntry("a2", "b")
.containsEntry("a3", "b");
assertThat(conf.getName()).isEqualTo("job1");
assertThat(conf.getScrapeRate()).isEqualTo(10);
assertThat(conf.getSources())
.hasSize(3);
assertThat(conf.getFields())
.hasSize(2)
.containsEntry("a", "DBasdf")
.containsEntry("b", "DBbsdf");
}
@Test
void parseJobs_missingEntries_fails() {
String jobs = "sources:\n" +
" a: b\n" +
"jobs:\n" +
" - name: job1\n" +
" scrapeRate: 10\n" +
" sources:\n" +
" - a1\n";
assertThatThrownBy(() -> mapper.readValue(jobs, ScraperConfiguration.class))
.isInstanceOf(MismatchedInputException.class);
}
@Test
void fromYaml_loads() {
String yaml = "sources:\n" +
" a1: b\n" +
" a2: b\n" +
" a3: b\n" +
"jobs:\n" +
" - name: job1\n" +
" scrapeRate: 10\n" +
" sources:\n" +
" - a1\n" +
" - a2\n" +
" - a3\n" +
" fields:\n" +
" a: DBasdf\n" +
" b: DBbsdf\n";
assertThatCode(() -> ScraperConfiguration.fromYaml(yaml))
.doesNotThrowAnyException();
}
@Test
void fromString_loads() {
String json = "{\n" +
" \"sources\": {\n" +
" \"a1\": \"b\",\n" +
" \"a2\": \"b\",\n" +
" \"a3\": \"b\"\n" +
" },\n" +
" \"jobs\": [\n" +
" {\n" +
" \"name\": \"job1\",\n" +
" \"scrapeRate\": 10,\n" +
" \"sources\": [\n" +
" \"a1\",\n" +
" \"a2\",\n" +
" \"a3\"\n" +
" ],\n" +
" \"fields\": {\n" +
" \"a\": \"DBasdf\",\n" +
" \"b\": \"DBbsdf\"\n" +
" }\n" +
" }\n" +
" ]\n" +
"}";
assertThatCode(() -> ScraperConfiguration.fromJson(json))
.doesNotThrowAnyException();
}
@Test
void new_notAllSourceAliasesAreResolvable_throws() {
String yaml = "sources:\n" +
" b: c\n" +
"jobs:\n" +
" - name: job1\n" +
" scrapeRate: 10\n" +
" sources:\n" +
" - s1\n" +
" fields:\n";
assertThatThrownBy(() -> ScraperConfiguration.fromYaml(yaml))
.isInstanceOf(PlcRuntimeException.class)
.hasStackTraceContaining("unreferenced sources: [s1]");
}
@Test
void generateScrapeJobs_fromConfig() {
String yaml = "sources:\n" +
" source1: 'connection string'\n" +
"jobs:\n" +
" - name: job1\n" +
" scrapeRate: 10\n" +
" sources:\n" +
" - source1\n" +
" fields:\n" +
" field1: 'DB1 Field 1'\n";
List<ScrapeJob> jobs = ScraperConfiguration.fromYaml(yaml).getJobs();
assertThat(jobs).hasSize(1);
ScrapeJob job = jobs.get(0);
assertThat(job.getName()).isEqualTo("job1");
assertThat(job.getScrapeRate()).isEqualTo(10);
assertThat(job.getConnections())
.hasSize(1)
.containsEntry("source1", "connection string");
assertThat(job.getFields())
.hasSize(1)
.containsEntry("field1", "DB1 Field 1");
}
@Nested
class Files {
@Test
void json() throws IOException {
ScraperConfiguration conf = ScraperConfiguration.fromFile("src/test/resources/config.json");
}
@Test
void yaml() throws IOException {
ScraperConfiguration conf = ScraperConfiguration.fromFile("src/test/resources/config.yml");
}
}
}