blob: 3e0575df36f8210ffdd647ea2763605406aedcad [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.metamodel.membrane.controllers;
import static org.junit.Assert.assertEquals;
import java.util.Map;
import org.apache.metamodel.membrane.app.InMemoryTenantRegistry;
import org.apache.metamodel.membrane.app.TenantRegistry;
import org.apache.metamodel.membrane.app.config.JacksonConfig;
import org.junit.Before;
import org.junit.Test;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TenantInteractionScenarioTest {
private MockMvc mockMvc;
@Before
public void init() {
final MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
messageConverter.setObjectMapper(new JacksonConfig().objectMapper());
final TenantRegistry tenantRegistry = new InMemoryTenantRegistry();
final TenantController tenantController = new TenantController(tenantRegistry);
final DataSourceController dataSourceController = new DataSourceController(tenantRegistry);
final SchemaController schemaController = new SchemaController(tenantRegistry);
final TableController tableController = new TableController(tenantRegistry);
final ColumnController columnController = new ColumnController(tenantRegistry);
final QueryController queryController = new QueryController(tenantRegistry);
final TableDataController tableDataController = new TableDataController(tenantRegistry);
mockMvc = MockMvcBuilders.standaloneSetup(tenantController, dataSourceController, schemaController,
tableController, columnController, queryController, tableDataController).setMessageConverters(
messageConverter).build();
}
@Test
public void testScenario() throws Exception {
// create tenant
{
final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.put("/tenant1").contentType(
MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
final String content = result.getResponse().getContentAsString();
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("tenant", map.get("type"));
assertEquals("tenant1", map.get("name"));
assertEquals("[]", map.get("datasources").toString());
}
// create datasource
{
final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.put("/tenant1/mydata").content(
"{'type':'pojo','database':'mydata','table-defs':'hello_world (greeting VARCHAR, who VARCHAR); foo (bar INTEGER, baz DATE);'}"
.replace('\'', '"')).contentType(MediaType.APPLICATION_JSON)).andExpect(
MockMvcResultMatchers.status().isOk()).andReturn();
final String content = result.getResponse().getContentAsString();
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("datasource", map.get("type"));
assertEquals("mydata", map.get("name"));
assertEquals(
"[{name=information_schema, uri=/tenant1/mydata/s/information_schema}, {name=mydata, uri=/tenant1/mydata/s/mydata}]",
map.get("schemas").toString());
}
// explore tenant - now with a datasource
{
final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/tenant1")).andExpect(
MockMvcResultMatchers.status().isOk()).andReturn();
final String content = result.getResponse().getContentAsString();
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("tenant", map.get("type"));
assertEquals("tenant1", map.get("name"));
assertEquals("[{name=mydata, uri=/tenant1/mydata}]", map.get("datasources").toString());
}
// explore schema
{
final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/tenant1/mydata/s/mydata")).andExpect(
MockMvcResultMatchers.status().isOk()).andReturn();
final String content = result.getResponse().getContentAsString();
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("schema", map.get("type"));
assertEquals("mydata", map.get("name"));
assertEquals(
"[{name=foo, uri=/tenant1/mydata/s/mydata/t/foo}, {name=hello_world, uri=/tenant1/mydata/s/mydata/t/hello_world}]",
map.get("tables").toString());
}
// explore table
{
final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/tenant1/mydata/s/mydata/t/foo"))
.andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
final String content = result.getResponse().getContentAsString();
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("table", map.get("type"));
assertEquals("foo", map.get("name"));
assertEquals("[{name=bar, uri=/tenant1/mydata/s/mydata/t/foo/c/bar}, "
+ "{name=baz, uri=/tenant1/mydata/s/mydata/t/foo/c/baz}]", map.get("columns").toString());
}
// explore column
{
final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/tenant1/mydata/s/mydata/t/foo/c/bar"))
.andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
final String content = result.getResponse().getContentAsString();
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("column", map.get("type"));
assertEquals("bar", map.get("name"));
assertEquals("{number=0, nullable=true, primary-key=false, indexed=false, column-type=INTEGER}", map.get(
"metadata").toString());
}
// query metadata from information_schema
{
final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/tenant1/mydata/q?sql={sql}",
"SELECT name, table FROM information_schema.columns")).andExpect(MockMvcResultMatchers.status()
.isOk()).andReturn();
final String content = result.getResponse().getContentAsString();
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("dataset", map.get("type"));
assertEquals("[columns.name, columns.table]", map.get("headers").toString());
assertEquals("[[bar, foo], [baz, foo], [greeting, hello_world], [who, hello_world]]", map.get("data")
.toString());
}
// insert into table (x2)
{
final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post(
"/tenant1/mydata/s/mydata/t/hello_world/d").content("{'insert':[{'greeting':'Howdy','who':'MetaModel'}]}"
.replace('\'', '"')).contentType(MediaType.APPLICATION_JSON)).andExpect(
MockMvcResultMatchers.status().isOk()).andReturn();
final String content = result.getResponse().getContentAsString();
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("{status=ok}", map.toString());
}
{
final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post(
"/tenant1/mydata/s/mydata/t/hello_world/d").content("{'insert':[{'greeting':'Hi','who':'Apache'}]}".replace(
'\'', '"')).contentType(MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers
.status().isOk()).andReturn();
final String content = result.getResponse().getContentAsString();
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("{status=ok}", map.toString());
}
// query the actual data
// query metadata from information_schema
{
final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/tenant1/mydata/q?sql={sql}",
"SELECT greeting, who AS who_is_it FROM hello_world"))
.andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
final String content = result.getResponse().getContentAsString();
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("dataset", map.get("type"));
assertEquals("[hello_world.greeting, hello_world.who AS who_is_it]", map.get("headers").toString());
assertEquals("[[Howdy, MetaModel], [Hi, Apache]]", map.get("data").toString());
}
}
}