]> source.dussan.org Git - sonarqube.git/blob
d0f6704fc8808a9d9d22f16887f16327848bb5a2
[sonarqube.git] /
1 /*
2  * SonarQube
3  * Copyright (C) 2009-2020 SonarSource SA
4  * mailto:info AT sonarsource DOT com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20 package org.sonar.server.platform.db.migration.sql;
21
22 import java.util.List;
23 import org.junit.Rule;
24 import org.junit.Test;
25 import org.junit.rules.ExpectedException;
26
27 import static org.assertj.core.api.Assertions.assertThat;
28 import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
29
30 public class CreateIndexBuilderTest {
31
32   @Rule
33   public ExpectedException expectedException = ExpectedException.none();
34
35   @Test
36   public void create_index_on_single_column() {
37     verifySql(new CreateIndexBuilder()
38       .setTable("issues")
39       .setName("issues_key")
40       .addColumn(newVarcharColumnDefBuilder().setColumnName("kee").setLimit(10).build()),
41       "CREATE INDEX issues_key ON issues (kee)");
42   }
43
44   @Test
45   public void create_unique_index_on_single_column() {
46     verifySql(new CreateIndexBuilder()
47       .setTable("issues")
48       .setName("issues_key")
49       .addColumn(newVarcharColumnDefBuilder().setColumnName("kee").setLimit(10).build())
50       .setUnique(true),
51       "CREATE UNIQUE INDEX issues_key ON issues (kee)");
52   }
53
54   @Test
55   public void create_index_on_multiple_columns() {
56     verifySql(new CreateIndexBuilder()
57       .setTable("rules")
58       .setName("rules_key")
59       .addColumn(newVarcharColumnDefBuilder().setColumnName("repository").setLimit(10).build())
60       .addColumn(newVarcharColumnDefBuilder().setColumnName("rule_key").setLimit(50).build()),
61       "CREATE INDEX rules_key ON rules (repository, rule_key)");
62   }
63
64   @Test
65   public void create_unique_index_on_multiple_columns() {
66     verifySql(new CreateIndexBuilder()
67       .setTable("rules")
68       .setName("rules_key")
69       .addColumn(newVarcharColumnDefBuilder().setColumnName("repository").setLimit(10).build())
70       .addColumn(newVarcharColumnDefBuilder().setColumnName("rule_key").setLimit(50).build())
71       .setUnique(true),
72       "CREATE UNIQUE INDEX rules_key ON rules (repository, rule_key)");
73   }
74
75   @Test
76   public void index_length_is_not_specified_on_big_varchar_columns() {
77     verifySql(new CreateIndexBuilder()
78       .setTable("issues")
79       .setName("issues_key")
80       .addColumn(newVarcharColumnDefBuilder().setColumnName("kee").setLimit(4000).build()),
81       "CREATE INDEX issues_key ON issues (kee)");
82   }
83
84   @Test
85   public void throw_NPE_if_table_is_missing() {
86     expectedException.expect(NullPointerException.class);
87     expectedException.expectMessage("Table name cannot be null");
88
89     new CreateIndexBuilder()
90       .setName("issues_key")
91       .addColumn(newVarcharColumnDefBuilder().setColumnName("kee").setLimit(10).build())
92       .build();
93   }
94
95   @Test
96   public void throw_NPE_if_index_name_is_missing() {
97     expectedException.expect(NullPointerException.class);
98     expectedException.expectMessage("Index name cannot be null");
99
100     new CreateIndexBuilder()
101       .setTable("issues")
102       .addColumn(newVarcharColumnDefBuilder().setColumnName("kee").setLimit(10).build())
103       .build();
104   }
105
106   @Test
107   public void throw_IAE_if_columns_are_missing() {
108     expectedException.expect(IllegalArgumentException.class);
109     expectedException.expectMessage("at least one column must be specified");
110
111     new CreateIndexBuilder()
112       .setTable("issues")
113       .setName("issues_key")
114       .build();
115   }
116
117   @Test
118   public void throw_IAE_if_table_name_is_not_valid() {
119     expectedException.expect(IllegalArgumentException.class);
120     expectedException.expectMessage("Table name must be lower case and contain only alphanumeric chars or '_', got '(not valid)'");
121
122     new CreateIndexBuilder()
123       .setTable("(not valid)")
124       .setName("issues_key")
125       .addColumn(newVarcharColumnDefBuilder().setColumnName("kee").setLimit(10).build())
126       .build();
127   }
128
129   @Test
130   public void throw_NPE_when_adding_null_column() {
131     expectedException.expect(NullPointerException.class);
132     expectedException.expectMessage("Column cannot be null");
133
134     new CreateIndexBuilder()
135       .setTable("issues")
136       .setName("issues_key")
137       .addColumn(null)
138       .build();
139   }
140
141   private static void verifySql(CreateIndexBuilder builder, String expectedSql) {
142     List<String> actual = builder.build();
143     assertThat(actual).containsExactly(expectedSql);
144   }
145
146 }