--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.db.version;
+
+public abstract class AbstractColumnDef implements ColumnDef {
+ private final String columnName;
+ private final boolean isNullable;
+
+ public AbstractColumnDef(String columnName, boolean isNullable) {
+ this.columnName = columnName;
+ this.isNullable = isNullable;
+ }
+
+ @Override
+ public String getName() {
+ return columnName;
+ }
+
+ @Override
+ public boolean isNullable() {
+ return isNullable;
+ }
+}
import java.util.List;
import org.sonar.db.dialect.Dialect;
import org.sonar.db.dialect.MsSql;
-import org.sonar.db.dialect.Oracle;
import org.sonar.db.dialect.PostgreSql;
import static com.google.common.collect.Lists.newArrayList;
+/**
+ * Generate a SQL query to add multiple columns on a table
+ */
public class AddColumnsBuilder {
private final Dialect dialect;
}
private void addColumn(StringBuilder sql, ColumnDef columnDef) {
- sql.append(columnDef.getName()).append(" ").append(typeToSql(columnDef));
- Integer limit = columnDef.getLimit();
- if (limit != null) {
- sql.append(" (").append(Integer.toString(limit)).append(")");
- }
+ sql.append(columnDef.getName()).append(" ").append(columnDef.generateSqlType(dialect));
sql.append(columnDef.isNullable() ? " NULL" : " NOT NULL");
}
- private String typeToSql(ColumnDef columnDef) {
- switch (columnDef.getType()) {
- case STRING:
- return "VARCHAR";
- case BIG_INTEGER:
- return !dialect.getId().equals(Oracle.ID) ? "BIGINT" : "NUMBER (38)";
- default:
- throw new IllegalArgumentException("Unsupported type : " + columnDef.getType());
- }
- }
-
}
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.db.version;
+
+import javax.annotation.CheckForNull;
+import org.sonar.db.dialect.Dialect;
+import org.sonar.db.dialect.Oracle;
+
+import static org.sonar.db.version.ColumnDefValidation.validateColumnName;
+
+public class BigDecimalColumnDef extends AbstractColumnDef {
+
+ private BigDecimalColumnDef(Builder builder) {
+ super(builder.columnName, builder.isNullable);
+ }
+
+ public static Builder newBigDecimalColumnDefBuilder() {
+ return new Builder();
+ }
+
+ @Override
+ public String generateSqlType(Dialect dialect) {
+ return dialect.getId().equals(Oracle.ID) ? "NUMBER (38)" : "BIGINT";
+ }
+
+ public static class Builder {
+ @CheckForNull
+ private String columnName;
+
+ private boolean isNullable;
+
+ public Builder setColumnName(String columnName) {
+ this.columnName = validateColumnName(columnName);
+ return this;
+ }
+
+ public Builder setIsNullable(boolean isNullable) {
+ this.isNullable = isNullable;
+ return this;
+ }
+
+ public BigDecimalColumnDef build() {
+ validateColumnName(columnName);
+ return new BigDecimalColumnDef(this);
+ }
+ }
+
+}
package org.sonar.db.version;
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Preconditions;
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
import org.sonar.db.dialect.Dialect;
-import org.sonar.db.dialect.Oracle;
-public class ColumnDef {
+public interface ColumnDef {
- private String name;
- private Type type;
- private boolean isNullable;
- private Integer limit;
+ boolean isNullable();
- public enum Type {
- STRING, BIG_INTEGER
- }
+ String getName();
- public ColumnDef setNullable(boolean isNullable) {
- this.isNullable = isNullable;
- return this;
- }
-
- public ColumnDef setLimit(@Nullable Integer limit) {
- this.limit = limit;
- return this;
- }
-
- public ColumnDef setName(String name) {
- Preconditions.checkArgument(CharMatcher.JAVA_LOWER_CASE.or(CharMatcher.anyOf("_")).matchesAllOf(name), "Column name should only contains lowercase and _ characters");
- this.name = name;
- return this;
- }
-
- public ColumnDef setType(Type type) {
- this.type = type;
- return this;
- }
-
- public boolean isNullable() {
- return isNullable;
- }
-
- @CheckForNull
- public Integer getLimit() {
- return limit;
- }
-
- public String getName() {
- return name;
- }
-
- public Type getType() {
- return type;
- }
-
- public String getSqlType(Dialect dialect) {
- switch (type) {
- case STRING:
- return "VARCHAR";
- case BIG_INTEGER:
- return dialect.getId().equals(Oracle.ID) ? "NUMBER (38)" : "BIGINT";
- default:
- throw new IllegalArgumentException("Unsupported type : " + type);
- }
- }
+ String generateSqlType(Dialect dialect);
}
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.db.version;
+
+import com.google.common.base.CharMatcher;
+import javax.annotation.Nullable;
+
+import static com.google.common.base.CharMatcher.JAVA_LOWER_CASE;
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+public class ColumnDefValidation {
+
+ private ColumnDefValidation() {
+ // Only static stuff here
+ }
+
+ public static String validateColumnName(@Nullable String columnName) {
+ String name = requireNonNull(columnName, "Column name cannot be null");
+ checkArgument(JAVA_LOWER_CASE.or(CharMatcher.anyOf("_")).matchesAllOf(name), String.format("Column name should only contains lowercase and _ characters, got '%s'", columnName));
+ return name;
+ }
+}
import org.sonar.db.dialect.Oracle;
import org.sonar.db.dialect.PostgreSql;
+/**
+ * Generate a SQL query to drop multiple columns from a table
+ */
public class DropColumnsBuilder {
private final Dialect dialect;
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.db.version;
+
+import javax.annotation.CheckForNull;
+import org.sonar.db.dialect.Dialect;
+
+import static java.util.Objects.requireNonNull;
+import static org.sonar.db.version.ColumnDefValidation.validateColumnName;
+
+public class StringColumnDef extends AbstractColumnDef {
+ private final int columnSize;
+
+ private StringColumnDef(Builder builder) {
+ super(builder.columnName, builder.isNullable);
+ this.columnSize = builder.columnSize;
+ }
+
+ public static Builder newStringColumnDefBuilder() {
+ return new Builder();
+ }
+
+ public int getColumnSize() {
+ return columnSize;
+ }
+
+ @Override
+ public String generateSqlType(Dialect dialect) {
+ return "VARCHAR (" + Integer.toString(columnSize) + ")";
+ }
+
+ public static class Builder {
+ @CheckForNull
+ private Integer columnSize;
+
+ @CheckForNull
+ private String columnName;
+
+ private boolean isNullable;
+
+ public Builder setColumnName(String columnName) {
+ this.columnName = validateColumnName(columnName);
+ return this;
+ }
+
+ public Builder setLimit(int limit) {
+ this.columnSize = limit;
+ return this;
+ }
+
+ public Builder setIsNullable(boolean isNullable) {
+ this.isNullable = isNullable;
+ return this;
+ }
+
+ public StringColumnDef build() {
+ validateColumnName(columnName);
+ requireNonNull(columnSize, "Limit cannot be null");
+ return new StringColumnDef(this);
+ }
+ }
+
+}
import java.sql.SQLException;
import org.sonar.db.Database;
import org.sonar.db.version.AddColumnsBuilder;
-import org.sonar.db.version.ColumnDef;
import org.sonar.db.version.DdlChange;
+import static org.sonar.db.version.BigDecimalColumnDef.newBigDecimalColumnDefBuilder;
+import static org.sonar.db.version.StringColumnDef.newStringColumnDefBuilder;
+
/**
* Add the following columns to the issues table :
* - issue_creation_date_ms
private String generateSql() {
return new AddColumnsBuilder(db.getDialect(), "issues")
- .addColumn(
- new ColumnDef()
- .setName("issue_creation_date_ms")
- .setType(ColumnDef.Type.BIG_INTEGER)
- .setNullable(true)
- )
- .addColumn(
- new ColumnDef()
- .setName("issue_update_date_ms")
- .setType(ColumnDef.Type.BIG_INTEGER)
- .setNullable(true)
- )
- .addColumn(
- new ColumnDef()
- .setName("issue_close_date_ms")
- .setType(ColumnDef.Type.BIG_INTEGER)
- .setNullable(true)
- )
- .addColumn(
- new ColumnDef()
- .setName("tags")
- .setType(ColumnDef.Type.STRING)
- .setLimit(4000)
- .setNullable(true))
- .addColumn(
- new ColumnDef()
- .setName("component_uuid")
- .setType(ColumnDef.Type.STRING)
- .setLimit(50)
- .setNullable(true))
- .addColumn(
- new ColumnDef()
- .setName("project_uuid")
- .setType(ColumnDef.Type.STRING)
- .setLimit(50)
- .setNullable(true))
+ .addColumn(newBigDecimalColumnDefBuilder().setColumnName("issue_creation_date_ms").setIsNullable(true).build())
+ .addColumn(newBigDecimalColumnDefBuilder().setColumnName("issue_update_date_ms").setIsNullable(true).build())
+ .addColumn(newBigDecimalColumnDefBuilder().setColumnName("issue_close_date_ms").setIsNullable(true).build())
+ .addColumn(newStringColumnDefBuilder().setColumnName("tags").setLimit(4000).setIsNullable(true).build())
+ .addColumn(newStringColumnDefBuilder().setColumnName("component_uuid").setLimit(50).setIsNullable(true).build())
+ .addColumn(newStringColumnDefBuilder().setColumnName("project_uuid").setLimit(50).setIsNullable(true).build())
.build();
}
import java.sql.SQLException;
import org.sonar.db.Database;
import org.sonar.db.version.AddColumnsBuilder;
-import org.sonar.db.version.ColumnDef;
import org.sonar.db.version.DdlChange;
-import static org.sonar.db.version.ColumnDef.Type.STRING;
+import static org.sonar.db.version.StringColumnDef.newStringColumnDefBuilder;
/**
* Add the following column to the manual_measures table :
private String generateSql() {
return new AddColumnsBuilder(getDatabase().getDialect(), "manual_measures")
- .addColumn(
- new ColumnDef()
- .setName("component_uuid")
- .setType(STRING)
- .setLimit(50)
- .setNullable(true))
+ .addColumn(newStringColumnDefBuilder().setColumnName("component_uuid").setLimit(50).setIsNullable(true).build())
.build();
}
}
import org.sonar.db.dialect.PostgreSql;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.db.version.ColumnDef.Type.BIG_INTEGER;
-import static org.sonar.db.version.ColumnDef.Type.STRING;
public class AddColumnsBuilderTest {
static final String TABLE_NAME = "issues";
- static final H2 H2_DIALECT = new H2();
- static final MySql MYSQL_DIALECT = new MySql();
- static final Oracle ORACLE_DIALECT = new Oracle();
- static final PostgreSql POSTGRES_DIALECT = new PostgreSql();
- static final MsSql MSSQL_DIALECT = new MsSql();
-
@Test
public void add_columns_on_h2() {
- assertThat(createSampleBuilder(H2_DIALECT).build())
+ assertThat(createSampleBuilder(new H2()).build())
.isEqualTo("ALTER TABLE issues ADD (date_in_ms BIGINT NULL, name VARCHAR (10) NOT NULL)");
}
@Test
public void add_columns_on_mysql() {
- assertThat(createSampleBuilder(MYSQL_DIALECT).build())
+ assertThat(createSampleBuilder(new MySql()).build())
.isEqualTo("ALTER TABLE issues ADD (date_in_ms BIGINT NULL, name VARCHAR (10) NOT NULL)");
}
@Test
public void add_columns_on_oracle() {
- assertThat(createSampleBuilder(ORACLE_DIALECT).build())
+ assertThat(createSampleBuilder(new Oracle()).build())
.isEqualTo("ALTER TABLE issues ADD (date_in_ms NUMBER (38) NULL, name VARCHAR (10) NOT NULL)");
}
@Test
public void add_columns_on_postgresql() {
- assertThat(createSampleBuilder(POSTGRES_DIALECT).build())
+ assertThat(createSampleBuilder(new PostgreSql()).build())
.isEqualTo("ALTER TABLE issues ADD COLUMN date_in_ms BIGINT NULL, ADD COLUMN name VARCHAR (10) NOT NULL");
}
@Test
public void add_columns_on_mssql() {
- assertThat(createSampleBuilder(MSSQL_DIALECT).build())
+ assertThat(createSampleBuilder(new MsSql()).build())
.isEqualTo("ALTER TABLE issues ADD date_in_ms BIGINT NULL, name VARCHAR (10) NOT NULL");
}
thrown.expect(IllegalStateException.class);
thrown.expectMessage("No column has been defined");
- new AddColumnsBuilder(H2_DIALECT, TABLE_NAME).build();
+ new AddColumnsBuilder(new H2(), TABLE_NAME).build();
}
private AddColumnsBuilder createSampleBuilder(Dialect dialect) {
return new AddColumnsBuilder(dialect, TABLE_NAME)
- .addColumn(new ColumnDef()
- .setName("date_in_ms")
- .setType(BIG_INTEGER)
- .setNullable(true))
- .addColumn(new ColumnDef()
- .setName("name")
- .setType(STRING)
- .setNullable(false)
- .setLimit(10));
+ .addColumn(new BigDecimalColumnDef.Builder().setColumnName("date_in_ms").setIsNullable(true).build())
+ .addColumn(new StringColumnDef.Builder().setColumnName("name").setLimit(10).setIsNullable(false).build());
}
-
}
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.db.version;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.sonar.db.dialect.H2;
+import org.sonar.db.dialect.MsSql;
+import org.sonar.db.dialect.MySql;
+import org.sonar.db.dialect.Oracle;
+import org.sonar.db.dialect.PostgreSql;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class BigDecimalColumnDefTest {
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Test
+ public void build_string_column_def() throws Exception {
+ BigDecimalColumnDef def = new BigDecimalColumnDef.Builder()
+ .setColumnName("issues")
+ .setIsNullable(true)
+ .build();
+
+ assertThat(def.getName()).isEqualTo("issues");
+ assertThat(def.isNullable()).isTrue();
+ }
+
+ @Test
+ public void generate_sql_type() throws Exception {
+ BigDecimalColumnDef def = new BigDecimalColumnDef.Builder()
+ .setColumnName("issues")
+ .setIsNullable(true)
+ .build();
+
+ assertThat(def.generateSqlType(new H2())).isEqualTo("BIGINT");
+ assertThat(def.generateSqlType(new PostgreSql())).isEqualTo("BIGINT");
+ assertThat(def.generateSqlType(new MsSql())).isEqualTo("BIGINT");
+ assertThat(def.generateSqlType(new MySql())).isEqualTo("BIGINT");
+ assertThat(def.generateSqlType(new Oracle())).isEqualTo("NUMBER (38)");
+ }
+
+ @Test
+ public void fail_with_NPE_if_name_is_null() throws Exception {
+ thrown.expect(NullPointerException.class);
+ thrown.expectMessage("Column name cannot be null");
+
+ new BigDecimalColumnDef.Builder()
+ .setColumnName(null);
+ }
+
+ @Test
+ public void fail_with_NPE_if_no_name() throws Exception {
+ thrown.expect(NullPointerException.class);
+ thrown.expectMessage("Column name cannot be null");
+
+ new BigDecimalColumnDef.Builder()
+ .build();
+ }
+
+}
+++ /dev/null
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package org.sonar.db.version;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.sonar.db.dialect.H2;
-import org.sonar.db.dialect.MsSql;
-import org.sonar.db.dialect.MySql;
-import org.sonar.db.dialect.Oracle;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.db.version.ColumnDef.Type.BIG_INTEGER;
-import static org.sonar.db.version.ColumnDef.Type.STRING;
-
-public class ColumnDefTest {
-
- @Rule
- public ExpectedException thrown = ExpectedException.none();
-
- @Test
- public void create_column_def() throws Exception {
- ColumnDef def = new ColumnDef()
- .setName("date_in_ms")
- .setType(STRING)
- .setLimit(10)
- .setNullable(true);
-
- assertThat(def.getName()).isEqualTo("date_in_ms");
- assertThat(def.getType()).isEqualTo(STRING);
- assertThat(def.getLimit()).isEqualTo(10);
- assertThat(def.isNullable()).isTrue();
- }
-
- @Test
- public void convert_varchar_type_to_sql() throws Exception {
- assertThat(new ColumnDef().setType(STRING).getSqlType(new H2())).isEqualTo("VARCHAR");
- assertThat(new ColumnDef().setType(STRING).getSqlType(new Oracle())).isEqualTo("VARCHAR");
- assertThat(new ColumnDef().setType(STRING).getSqlType(new MsSql())).isEqualTo("VARCHAR");
- assertThat(new ColumnDef().setType(STRING).getSqlType(new MySql())).isEqualTo("VARCHAR");
- }
-
- @Test
- public void convert_big_integer_type_to_sql() throws Exception {
- assertThat(new ColumnDef().setType(BIG_INTEGER).getSqlType(new H2())).isEqualTo("BIGINT");
- assertThat(new ColumnDef().setType(BIG_INTEGER).getSqlType(new Oracle())).isEqualTo("NUMBER (38)");
- assertThat(new ColumnDef().setType(BIG_INTEGER).getSqlType(new MsSql())).isEqualTo("BIGINT");
- assertThat(new ColumnDef().setType(BIG_INTEGER).getSqlType(new MySql())).isEqualTo("BIGINT");
- }
-
-
- @Test
- public void fail_when_column_name_is_in_upper_case() {
- thrown.expect(IllegalArgumentException.class);
- thrown.expectMessage("Column name should only contains lowercase and _ characters");
-
- new ColumnDef()
- .setName("DATE_IN_MS")
- .setType(BIG_INTEGER)
- .setNullable(true);
- }
-
- @Test
- public void fail_when_column_name_contains_invalid_character() {
- thrown.expect(IllegalArgumentException.class);
- thrown.expectMessage("Column name should only contains lowercase and _ characters");
-
- new ColumnDef()
- .setName("date-in/ms")
- .setType(BIG_INTEGER)
- .setNullable(true);
- }
-}
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.db.version;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import static org.sonar.db.version.ColumnDefValidation.validateColumnName;
+
+public class ColumnDefValidationTest {
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Test
+ public void accept_valid_table_name() throws Exception {
+ validateColumnName("date_in_ms");
+ }
+
+ @Test
+ public void fail_with_NPE_if_name_is_null() throws Exception {
+ thrown.expect(NullPointerException.class);
+ thrown.expectMessage("Column name cannot be null");
+
+ validateColumnName(null);
+ }
+
+ @Test
+ public void fail_when_column_name_is_in_upper_case() {
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("Column name should only contains lowercase and _ characters, got 'DATE_IN_MS'");
+
+ validateColumnName("DATE_IN_MS");
+ }
+
+ @Test
+ public void fail_when_column_name_contains_invalid_character() {
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("Column name should only contains lowercase and _ characters, got 'date-in/ms'");
+
+ validateColumnName("date-in/ms");
+ }
+
+}
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.db.version;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.sonar.db.dialect.H2;
+import org.sonar.db.dialect.MsSql;
+import org.sonar.db.dialect.MySql;
+import org.sonar.db.dialect.Oracle;
+import org.sonar.db.dialect.PostgreSql;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class StringColumnDefTest {
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Test
+ public void build_string_column_def() throws Exception {
+ StringColumnDef def = new StringColumnDef.Builder()
+ .setColumnName("issues")
+ .setLimit(10)
+ .setIsNullable(true)
+ .build();
+
+ assertThat(def.getName()).isEqualTo("issues");
+ assertThat(def.getColumnSize()).isEqualTo(10);
+ assertThat(def.isNullable()).isTrue();
+ }
+
+ @Test
+ public void generate_sql_type() throws Exception {
+ StringColumnDef def = new StringColumnDef.Builder()
+ .setColumnName("issues")
+ .setLimit(10)
+ .setIsNullable(true)
+ .build();
+
+ assertThat(def.generateSqlType(new H2())).isEqualTo("VARCHAR (10)");
+ assertThat(def.generateSqlType(new PostgreSql())).isEqualTo("VARCHAR (10)");
+ assertThat(def.generateSqlType(new MySql())).isEqualTo("VARCHAR (10)");
+ assertThat(def.generateSqlType(new MsSql())).isEqualTo("VARCHAR (10)");
+ assertThat(def.generateSqlType(new Oracle())).isEqualTo("VARCHAR (10)");
+ }
+
+ @Test
+ public void fail_with_NPE_if_name_is_null() throws Exception {
+ thrown.expect(NullPointerException.class);
+ thrown.expectMessage("Column name cannot be null");
+
+ new StringColumnDef.Builder()
+ .setColumnName(null);
+ }
+
+ @Test
+ public void fail_with_NPE_if_no_name() throws Exception {
+ thrown.expect(NullPointerException.class);
+ thrown.expectMessage("Column name cannot be null");
+
+ new StringColumnDef.Builder()
+ .build();
+ }
+
+ @Test
+ public void fail_with_NPE_if_size_is_null() throws Exception {
+ thrown.expect(NullPointerException.class);
+ thrown.expectMessage("Limit cannot be null");
+
+ new StringColumnDef.Builder()
+ .setColumnName("issues")
+ .build();
+ }
+}