|
| 1 | +using System; |
| 2 | +using System.Collections.Generic; |
1 | 3 | using System.Data; |
| 4 | +using System.Globalization; |
2 | 5 | using System.Linq; |
3 | 6 | using System.Threading.Tasks; |
4 | 7 | using DotNetProjects.Migrator.Framework; |
| 8 | +using DotNetProjects.Migrator.Providers.Models.Indexes; |
5 | 9 | using DotNetProjects.Migrator.Providers.Models.Indexes.Enums; |
6 | 10 | using Migrator.Tests.Providers.Generic; |
7 | 11 | using Npgsql; |
@@ -160,4 +164,152 @@ public void AddIndex_IncludeColumnsMultiple_Success() |
160 | 164 | Assert.That(index.IncludeColumns, Is.EquivalentTo([columnName2, columnName3]) |
161 | 165 | .Using<string>((x, y) => string.Compare(x, y, ignoreCase: true))); |
162 | 166 | } |
| 167 | + |
| 168 | + /// <summary> |
| 169 | + /// This test is located in the dedicated database type folder not in the base class since partial indexes (Oracle) are not supported in the migrator at this point in time. |
| 170 | + /// </summary> |
| 171 | + [Test] |
| 172 | + public void AddIndex_FilteredIndexSingle_Success() |
| 173 | + { |
| 174 | + // Arrange |
| 175 | + const string tableName = "TestTable"; |
| 176 | + const string columnName1 = "TestColumn1"; |
| 177 | + |
| 178 | + const string indexName = "TestIndexName"; |
| 179 | + |
| 180 | + Provider.AddTable(tableName, |
| 181 | + new Column(columnName1, DbType.Int16) |
| 182 | + ); |
| 183 | + |
| 184 | + List<FilterItem> filterItems = [ |
| 185 | + new() { Filter = FilterType.EqualTo, ColumnName = columnName1, Value = 1 }, |
| 186 | + ]; |
| 187 | + |
| 188 | + // Act |
| 189 | + Provider.AddIndex(tableName, |
| 190 | + new Index |
| 191 | + { |
| 192 | + Name = indexName, |
| 193 | + KeyColumns = [columnName1], |
| 194 | + Unique = true, |
| 195 | + FilterItems = filterItems |
| 196 | + }); |
| 197 | + |
| 198 | + // Assert |
| 199 | + |
| 200 | + var indexesFromDatabase = Provider.GetIndexes(table: tableName); |
| 201 | + var filteredItemsFromDatabase = indexesFromDatabase.Single().FilterItems; |
| 202 | + |
| 203 | + // We cannot find out the exact DbType so we compare strings. |
| 204 | + foreach (var filteredItemFromDatabase in filteredItemsFromDatabase) |
| 205 | + { |
| 206 | + var expected = filterItems.Single(x => x.ColumnName.Equals(filteredItemFromDatabase.ColumnName, StringComparison.OrdinalIgnoreCase)); |
| 207 | + Assert.That(filteredItemFromDatabase.Filter, Is.EqualTo(expected.Filter)); |
| 208 | + Assert.That(Convert.ToString(filteredItemFromDatabase.Value, CultureInfo.InvariantCulture), Is.EqualTo(Convert.ToString(expected.Value, CultureInfo.InvariantCulture))); |
| 209 | + } |
| 210 | + |
| 211 | + Assert.That( |
| 212 | + filteredItemsFromDatabase.Select(x => x.ColumnName.ToLowerInvariant()), |
| 213 | + Is.EquivalentTo(filterItems.Select(x => x.ColumnName.ToLowerInvariant())) |
| 214 | + ); |
| 215 | + } |
| 216 | + |
| 217 | + /// <summary> |
| 218 | + /// This test is located in the dedicated database type folder not in the base class since partial indexes (Oracle) are not supported in the migrator at this point in time. |
| 219 | + /// </summary> |
| 220 | + [Test] |
| 221 | + public void AddIndex_FilteredIndexMiscellaneousFilterTypesAndDataTypes_Success() |
| 222 | + { |
| 223 | + // Arrange |
| 224 | + const string tableName = "TestTable"; |
| 225 | + const string columnName1 = "TestColumn1"; |
| 226 | + const string columnName2 = "TestColumn2"; |
| 227 | + const string columnName3 = "TestColumn3"; |
| 228 | + const string columnName4 = "TestColumn4"; |
| 229 | + const string columnName5 = "TestColumn5"; |
| 230 | + const string columnName6 = "TestColumn6"; |
| 231 | + const string columnName7 = "TestColumn7"; |
| 232 | + const string columnName8 = "TestColumn8"; |
| 233 | + const string columnName9 = "TestColumn9"; |
| 234 | + const string columnName10 = "TestColumn10"; |
| 235 | + const string columnName11 = "TestColumn11"; |
| 236 | + const string columnName12 = "TestColumn12"; |
| 237 | + const string columnName13 = "TestColumn13"; |
| 238 | + |
| 239 | + const string indexName = "TestIndexName"; |
| 240 | + |
| 241 | + Provider.AddTable(tableName, |
| 242 | + new Column(columnName1, DbType.Int16), |
| 243 | + new Column(columnName2, DbType.Int32), |
| 244 | + new Column(columnName3, DbType.Int64), |
| 245 | + new Column(columnName4, DbType.UInt16), |
| 246 | + new Column(columnName5, DbType.UInt32), |
| 247 | + new Column(columnName6, DbType.UInt64), |
| 248 | + new Column(columnName7, DbType.String), |
| 249 | + new Column(columnName8, DbType.Int32), |
| 250 | + new Column(columnName9, DbType.Int32), |
| 251 | + new Column(columnName10, DbType.Int32), |
| 252 | + new Column(columnName11, DbType.Int32), |
| 253 | + new Column(columnName12, DbType.Int32), |
| 254 | + new Column(columnName13, DbType.Int32) |
| 255 | + ); |
| 256 | + |
| 257 | + List<FilterItem> filterItems = [ |
| 258 | + new() { Filter = FilterType.EqualTo, ColumnName = columnName1, Value = 1 }, |
| 259 | + new() { Filter = FilterType.GreaterThan, ColumnName = columnName2, Value = 2 }, |
| 260 | + new() { Filter = FilterType.GreaterThanOrEqualTo, ColumnName = columnName3, Value = 2323 }, |
| 261 | + new() { Filter = FilterType.NotEqualTo, ColumnName = columnName4, Value = 3434 }, |
| 262 | + new() { Filter = FilterType.NotEqualTo, ColumnName = columnName5, Value = -3434 }, |
| 263 | + new() { Filter = FilterType.SmallerThan, ColumnName = columnName6, Value = 3434345345 }, |
| 264 | + new() { Filter = FilterType.NotEqualTo, ColumnName = columnName7, Value = "asdf" }, |
| 265 | + new() { Filter = FilterType.EqualTo, ColumnName = columnName8, Value = 11 }, |
| 266 | + new() { Filter = FilterType.GreaterThan, ColumnName = columnName9, Value = 22 }, |
| 267 | + new() { Filter = FilterType.GreaterThanOrEqualTo, ColumnName = columnName10, Value = 33 }, |
| 268 | + new() { Filter = FilterType.NotEqualTo, ColumnName = columnName11, Value = 44 }, |
| 269 | + new() { Filter = FilterType.SmallerThan, ColumnName = columnName12, Value = 55 }, |
| 270 | + new() { Filter = FilterType.SmallerThanOrEqualTo, ColumnName = columnName13, Value = 66 } |
| 271 | + ]; |
| 272 | + |
| 273 | + // Act |
| 274 | + Provider.AddIndex(tableName, |
| 275 | + new Index |
| 276 | + { |
| 277 | + Name = indexName, |
| 278 | + KeyColumns = [ |
| 279 | + columnName1, |
| 280 | + columnName2, |
| 281 | + columnName3, |
| 282 | + columnName4, |
| 283 | + columnName5, |
| 284 | + columnName6, |
| 285 | + columnName7, |
| 286 | + columnName8, |
| 287 | + columnName9, |
| 288 | + columnName10, |
| 289 | + columnName11, |
| 290 | + columnName12, |
| 291 | + columnName13 |
| 292 | + ], |
| 293 | + Unique = false, |
| 294 | + FilterItems = filterItems |
| 295 | + }); |
| 296 | + |
| 297 | + // Assert |
| 298 | + |
| 299 | + var indexesFromDatabase = Provider.GetIndexes(table: tableName); |
| 300 | + var filteredItemsFromDatabase = indexesFromDatabase.Single().FilterItems; |
| 301 | + |
| 302 | + // We cannot find out the exact DbType so we compare strings. |
| 303 | + foreach (var filteredItemFromDatabase in filteredItemsFromDatabase) |
| 304 | + { |
| 305 | + var expected = filterItems.Single(x => x.ColumnName.Equals(filteredItemFromDatabase.ColumnName, StringComparison.OrdinalIgnoreCase)); |
| 306 | + Assert.That(filteredItemFromDatabase.Filter, Is.EqualTo(expected.Filter)); |
| 307 | + Assert.That(Convert.ToString(filteredItemFromDatabase.Value, CultureInfo.InvariantCulture), Is.EqualTo(Convert.ToString(expected.Value, CultureInfo.InvariantCulture))); |
| 308 | + } |
| 309 | + |
| 310 | + Assert.That( |
| 311 | + filteredItemsFromDatabase.Select(x => x.ColumnName.ToLowerInvariant()), |
| 312 | + Is.EquivalentTo(filterItems.Select(x => x.ColumnName.ToLowerInvariant())) |
| 313 | + ); |
| 314 | + } |
163 | 315 | } |
0 commit comments