blob: 587b9395f514fd646ab25487e8bc5b26bad7730a [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.iceberg.catalog;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
public class TestTableIdentifierParser {
@Test
public void testTableIdentifierToJson() {
String json = "{\"namespace\":[\"accounting\",\"tax\"],\"name\":\"paid\"}";
TableIdentifier identifier = TableIdentifier.of(Namespace.of("accounting", "tax"), "paid");
Assertions.assertThat(TableIdentifierParser.toJson(identifier))
.as("Should be able to serialize a table identifier with both namespace and name")
.isEqualTo(json);
TableIdentifier identifierWithEmptyNamespace = TableIdentifier.of(Namespace.empty(), "paid");
String jsonWithEmptyNamespace = "{\"namespace\":[],\"name\":\"paid\"}";
Assertions.assertThat(TableIdentifierParser.toJson(identifierWithEmptyNamespace))
.as("Should be able to serialize a table identifier that uses the empty namespace")
.isEqualTo(jsonWithEmptyNamespace);
}
@Test
public void testTableIdentifierFromJson() {
String json = "{\"namespace\":[\"accounting\",\"tax\"],\"name\":\"paid\"}";
TableIdentifier identifier = TableIdentifier.of(Namespace.of("accounting", "tax"), "paid");
Assertions.assertThat(TableIdentifierParser.fromJson(json))
.as("Should be able to deserialize a valid table identifier")
.isEqualTo(identifier);
TableIdentifier identifierWithEmptyNamespace = TableIdentifier.of(Namespace.empty(), "paid");
String jsonWithEmptyNamespace = "{\"namespace\":[],\"name\":\"paid\"}";
Assertions.assertThat(TableIdentifierParser.fromJson(jsonWithEmptyNamespace))
.as("Should be able to deserialize a valid multi-level table identifier")
.isEqualTo(identifierWithEmptyNamespace);
String identifierMissingNamespace = "{\"name\":\"paid\"}";
Assertions.assertThat(TableIdentifierParser.fromJson(identifierMissingNamespace))
.as(
"Should implicitly convert a missing namespace into the the empty namespace when parsing")
.isEqualTo(identifierWithEmptyNamespace);
}
@Test
public void testFailParsingWhenNullOrEmptyJson() {
String nullJson = null;
Assertions.assertThatThrownBy(() -> TableIdentifierParser.fromJson(nullJson))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Cannot parse table identifier from invalid JSON: null");
String emptyString = "";
Assertions.assertThatThrownBy(() -> TableIdentifierParser.fromJson(emptyString))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Cannot parse table identifier from invalid JSON: ''");
String emptyJson = "{}";
Assertions.assertThatThrownBy(() -> TableIdentifierParser.fromJson(emptyJson))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Cannot parse missing string: name");
String emptyJsonArray = "[]";
Assertions.assertThatThrownBy(() -> TableIdentifierParser.fromJson(emptyJsonArray))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Cannot parse missing or non-object table identifier: []");
}
@Test
public void testFailParsingWhenMissingRequiredFields() {
String identifierMissingName = "{\"namespace\":[\"accounting\",\"tax\"]}";
Assertions.assertThatThrownBy(() -> TableIdentifierParser.fromJson(identifierMissingName))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Cannot parse missing string: name");
}
@Test
public void testFailWhenFieldsHaveInvalidValues() {
String invalidNamespace = "{\"namespace\":\"accounting.tax\",\"name\":\"paid\"}";
Assertions.assertThatThrownBy(() -> TableIdentifierParser.fromJson(invalidNamespace))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Cannot parse JSON array from non-array value: namespace: \"accounting.tax\"");
String invalidName = "{\"namespace\":[\"accounting\",\"tax\"],\"name\":1234}";
Assertions.assertThatThrownBy(() -> TableIdentifierParser.fromJson(invalidName))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Cannot parse to a string value: name: 1234");
}
}