Skip to content

Commit ed0202d

Browse files
author
Henk Kin
committed
Fixed null reference in IdentifierValueConverter
1 parent aaca19e commit ed0202d

12 files changed

+533
-3
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using Microsoft.EntityFrameworkCore.Migrations;
2+
using System;
3+
using System.Linq;
4+
using System.Reflection;
5+
using Microsoft.EntityFrameworkCore.Metadata;
6+
using Microsoft.EntityFrameworkCore.Metadata.Conventions;
7+
using Microsoft.EntityFrameworkCore.Metadata.Internal;
8+
using Xunit;
9+
10+
namespace Identifiers.EntityFrameworkCore.SqlServer.Tests
11+
{
12+
public class IdentifierMigrationsAnnotationProviderTests
13+
{
14+
[Fact]
15+
public void For_WhenCalledWithoutExistingAnnotation_ItShouldReturnExistingAnnotations()
16+
{
17+
// Arrange
18+
var identifierMigrationsAnnotationProvider = new IdentifierMigrationsAnnotationProvider(new MigrationsAnnotationProviderDependencies());
19+
var entityType = new EntityType(typeof(object), new Model(), ConfigurationSource.DataAnnotation);
20+
IProperty property = new Property("id", typeof(int), null, null, entityType, ConfigurationSource.DataAnnotation, null);
21+
22+
// Act
23+
var results = identifierMigrationsAnnotationProvider.For(property);
24+
25+
// Assert
26+
Assert.Empty(results);
27+
}
28+
29+
[Fact]
30+
public void For_WhenCalledForPropertyWithExistingAnnotations_ItShouldReturnExistingAnnotations()
31+
{
32+
// Arrange
33+
var identifierMigrationsAnnotationProvider = new IdentifierMigrationsAnnotationProvider(new MigrationsAnnotationProviderDependencies());
34+
35+
var conventionSet = new ConventionSet();
36+
var entityType = new EntityType(typeof(Entity), new Model(conventionSet), ConfigurationSource.DataAnnotation);
37+
38+
Property property = new Property("Id", typeof(int), null, null, entityType, ConfigurationSource.DataAnnotation, null);
39+
property.AddAnnotation("Identifier", 12);
40+
41+
// Act
42+
var results = identifierMigrationsAnnotationProvider.For(property).ToList();
43+
44+
// Assert
45+
Assert.Single(results);
46+
Assert.Equal("SqlServer:ValueGenerationStrategy", results.First().Name);
47+
Assert.Equal(12, results.First().Value);
48+
}
49+
50+
public class Entity
51+
{
52+
public int Id { get; set; }
53+
}
54+
}
55+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using Microsoft.EntityFrameworkCore.Metadata;
3+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
4+
using Microsoft.EntityFrameworkCore.Metadata.Internal;
5+
using Xunit;
6+
7+
namespace Identifiers.EntityFrameworkCore.SqlServer.Tests
8+
{
9+
public class IdentifierPropertyBuilderExtensionsTests
10+
{
11+
[Fact]
12+
public void WhenNotCalled_ItShouldHaveDefaultSituation()
13+
{
14+
// Arrange
15+
var entityType = new EntityType("Entity", new Model(), ConfigurationSource.DataAnnotation);
16+
17+
// Act
18+
var result = new PropertyBuilder<Identifier>(new Property("Id", typeof(Identifier), null, null, entityType, ConfigurationSource.Convention, ConfigurationSource.Convention));
19+
20+
// Assert
21+
Assert.Equal(ValueGenerated.Never, result.Metadata.ValueGenerated);
22+
Assert.Null(result.Metadata.FindAnnotation("Identifier"));
23+
Assert.Equal(PropertySaveBehavior.Save, result.Metadata.GetBeforeSaveBehavior());
24+
}
25+
26+
[Fact]
27+
public void WhenCalled_ItShouldSetValueGeneratedToOnAdd()
28+
{
29+
// Arrange
30+
var entityType = new EntityType("Entity", new Model(), ConfigurationSource.DataAnnotation);
31+
var propertyBuilder = new PropertyBuilder<Identifier>(new Property("Id", typeof(Identifier), null, null, entityType, ConfigurationSource.Convention, ConfigurationSource.Convention));
32+
33+
// Act
34+
var result = propertyBuilder.IdentifierValueGeneratedOnAdd();
35+
36+
// Assert
37+
Assert.Equal(ValueGenerated.OnAdd, result.Metadata.ValueGenerated);
38+
}
39+
40+
[Fact]
41+
public void WhenCalled_ItShouldAddIdentifierAnnotation()
42+
{
43+
// Arrange
44+
var entityType = new EntityType("Entity", new Model(), ConfigurationSource.DataAnnotation);
45+
var propertyBuilder = new PropertyBuilder<Identifier>(new Property("Id", typeof(Identifier), null, null, entityType, ConfigurationSource.Convention, ConfigurationSource.Convention));
46+
47+
// Act
48+
var result = propertyBuilder.IdentifierValueGeneratedOnAdd();
49+
50+
// Assert
51+
var identifierAnnotation = result.Metadata.FindAnnotation("Identifier");
52+
Assert.NotNull(identifierAnnotation);
53+
Assert.Equal("Identifier", identifierAnnotation.Name);
54+
Assert.Equal(SqlServerValueGenerationStrategy.IdentityColumn, identifierAnnotation.Value);
55+
}
56+
57+
58+
[Fact]
59+
public void WhenCalled_ItShouldSetBeforeSaveBehaviorToIgnore()
60+
{
61+
// Arrange
62+
var entityType = new EntityType("Entity", new Model(), ConfigurationSource.DataAnnotation);
63+
var propertyBuilder = new PropertyBuilder<Identifier>(new Property("Id", typeof(Identifier), null, null, entityType, ConfigurationSource.Convention, ConfigurationSource.Convention));
64+
65+
// Act
66+
var result = propertyBuilder.IdentifierValueGeneratedOnAdd();
67+
68+
// Assert
69+
Assert.Equal(PropertySaveBehavior.Ignore, result.Metadata.GetBeforeSaveBehavior());
70+
}
71+
}
72+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using Microsoft.EntityFrameworkCore.Infrastructure;
3+
using Microsoft.EntityFrameworkCore.Migrations;
4+
using Microsoft.EntityFrameworkCore.SqlServer.Migrations.Internal;
5+
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
6+
using Microsoft.Extensions.DependencyInjection;
7+
using Xunit;
8+
9+
namespace Identifiers.EntityFrameworkCore.SqlServer.Tests
10+
{
11+
public class IdentifierSqlServerDbContextOptionsExtensionsTests
12+
{
13+
[Fact]
14+
public void WhenNotCalled_ItShouldHaveDefaultSituation()
15+
{
16+
// Arrange
17+
var serviceCollection = new ServiceCollection();
18+
19+
serviceCollection.AddDbContext<TestDbContext>(builder =>
20+
builder.UseSqlServer("TestDatabase")
21+
);
22+
23+
var serviceProvider = serviceCollection.BuildServiceProvider();
24+
var testDbContext = serviceProvider.GetRequiredService<TestDbContext>();
25+
26+
// Act
27+
var migrationsAnnotationProvider = testDbContext.GetService<IMigrationsAnnotationProvider>();
28+
var valueConverterSelector = testDbContext.GetService<IValueConverterSelector>();
29+
30+
// Assert
31+
Assert.NotNull(testDbContext);
32+
Assert.NotEqual(typeof(IdentifierMigrationsAnnotationProvider), migrationsAnnotationProvider.GetType());
33+
Assert.Equal(typeof(SqlServerMigrationsAnnotationProvider), migrationsAnnotationProvider.GetType());
34+
Assert.NotEqual(typeof(IdentifierValueConverterSelector<int>), valueConverterSelector.GetType());
35+
Assert.Equal(typeof(ValueConverterSelector), valueConverterSelector.GetType());
36+
}
37+
38+
[Fact]
39+
public void WhenCalled_ItShouldRegisterIdentifierMigrationsAnnotationProvider()
40+
{
41+
// Arrange
42+
var serviceCollection = new ServiceCollection();
43+
44+
serviceCollection.AddDbContext<TestDbContext>(builder =>
45+
builder.UseSqlServer("TestDatabase")
46+
.UseIdentifiers<int>());
47+
48+
var serviceProvider = serviceCollection.BuildServiceProvider();
49+
var testDbContext = serviceProvider.GetRequiredService<TestDbContext>();
50+
51+
// Act
52+
var migrationsAnnotationProvider = testDbContext.GetService<IMigrationsAnnotationProvider>();
53+
54+
// Assert
55+
Assert.NotNull(testDbContext);
56+
57+
Assert.Equal(typeof(IdentifierMigrationsAnnotationProvider), migrationsAnnotationProvider.GetType());
58+
}
59+
60+
61+
[Fact]
62+
public void WhenCalled_ItShouldRegisterIdentifierValueConverterSelector()
63+
{
64+
// Arrange
65+
var serviceCollection = new ServiceCollection();
66+
67+
serviceCollection.AddDbContext<TestDbContext>(builder =>
68+
builder.UseSqlServer("TestDatabase")
69+
.UseIdentifiers<int>());
70+
71+
var serviceProvider = serviceCollection.BuildServiceProvider();
72+
var testDbContext = serviceProvider.GetRequiredService<TestDbContext>();
73+
74+
// Act
75+
var valueConverterSelector = testDbContext.GetService<IValueConverterSelector>();
76+
77+
// Assert
78+
Assert.NotNull(testDbContext);
79+
Assert.Equal(typeof(IdentifierValueConverterSelector<int>), valueConverterSelector.GetType());
80+
}
81+
82+
public class TestDbContext : DbContext
83+
{
84+
public TestDbContext(DbContextOptions<TestDbContext> options) : base(options)
85+
{
86+
87+
}
88+
}
89+
}
90+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using System.Linq;
2+
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
3+
using Xunit;
4+
5+
namespace Identifiers.EntityFrameworkCore.SqlServer.Tests
6+
{
7+
public class IdentifierValueConverterSelectorTests
8+
{
9+
[Fact]
10+
public void WhenCalledForIdentifier_ItShouldReturnAValueConverterInfo()
11+
{
12+
// Arrange
13+
var identifierValueConverterSelector = new IdentifierValueConverterSelector<int>(new ValueConverterSelectorDependencies());
14+
15+
// Act
16+
var results = identifierValueConverterSelector.Select(typeof(Identifier)).ToList();
17+
18+
// Assert
19+
Assert.Equal(typeof(int), results.Single().ProviderClrType);
20+
Assert.Equal(typeof(Identifier), results.Single().ModelClrType);
21+
Assert.Null(results.Single().MappingHints);
22+
}
23+
24+
[Fact]
25+
public void WhenCalledForNullableIdentifier_ItShouldReturnAValueConverterInfo()
26+
{
27+
// Arrange
28+
var identifierValueConverterSelector = new IdentifierValueConverterSelector<int>(new ValueConverterSelectorDependencies());
29+
30+
// Act
31+
var results = identifierValueConverterSelector.Select(typeof(Identifier?)).ToList();
32+
33+
// Assert
34+
Assert.Equal(typeof(int), results.Single().ProviderClrType);
35+
Assert.Equal(typeof(Identifier?), results.Single().ModelClrType);
36+
Assert.Null(results.Single().MappingHints);
37+
}
38+
39+
[Fact]
40+
public void WhenCalledForNullableIdentifierAndWithProviderType_ItShouldReturnAValueConverterInfo()
41+
{
42+
// Arrange
43+
var identifierValueConverterSelector = new IdentifierValueConverterSelector<int>(new ValueConverterSelectorDependencies());
44+
45+
// Act
46+
var results = identifierValueConverterSelector.Select(typeof(Identifier?), typeof(int)).ToList();
47+
48+
// Assert
49+
Assert.Equal(typeof(int), results.Single().ProviderClrType);
50+
Assert.Equal(typeof(Identifier?), results.Single().ModelClrType);
51+
Assert.Null(results.Single().MappingHints);
52+
}
53+
54+
[Fact]
55+
public void WhenCalledForIdentifierAndFactoryIsUsed_ItShouldCreateAValueConverter()
56+
{
57+
// Arrange
58+
var identifierValueConverterSelector = new IdentifierValueConverterSelector<int>(new ValueConverterSelectorDependencies());
59+
var results = identifierValueConverterSelector.Select(typeof(Identifier)).ToList();
60+
var valueConverterInfo = results.Single();
61+
62+
// Act
63+
var valueConverter = valueConverterInfo.Create();
64+
65+
// Assert
66+
Assert.NotNull(valueConverter);
67+
Assert.NotNull(valueConverter.MappingHints);
68+
Assert.Equal(typeof(int), valueConverter.ProviderClrType);
69+
Assert.Equal(typeof(Identifier), valueConverter.ModelClrType);
70+
Assert.Null(results.Single().MappingHints);
71+
}
72+
73+
[Fact]
74+
public void WhenCalledForInteger_ItShouldReturnDefaultValueConverterInfos()
75+
{
76+
// Arrange
77+
var identifierValueConverterSelector = new IdentifierValueConverterSelector<int>(new ValueConverterSelectorDependencies());
78+
79+
// Act
80+
var results = identifierValueConverterSelector.Select(typeof(int)).ToList();
81+
82+
// Assert
83+
Assert.Equal(12, results.Count);
84+
Assert.True(results.All(x=>x.ModelClrType == typeof(int)));
85+
}
86+
}
87+
}

0 commit comments

Comments
 (0)