EF #2

Merged
nathan.boileau merged 16 commits from EF into master 2 years ago

@ -54,7 +54,7 @@ steps:
path: /docs path: /docs
commands: commands:
#- cd Documentation/doxygen #- cd Documentation/doxygen
#- doxygen Doxyfile #- doxygen Doxyfile
- /entrypoint.sh - /entrypoint.sh
when: when:
branch: branch:

@ -1,15 +1,23 @@
using System; using System.Collections.ObjectModel;
using System.Collections.Generic; using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EFLol namespace EFLol
{ {
public class ChampionEntity public class ChampionEntity
{ {
public int Id { get; set; } public int Id { get; set; }
[MaxLength(30, ErrorMessage = "Name cannot be longer than 30 characters.")]
public string Name { get; set; } public string Name { get; set; }
[MaxLength(256, ErrorMessage = "Bio cannot be longer than 256 characters.")]
public string Bio { get; set; } public string Bio { get; set; }
//public ChampionClass Class { get; set; }
//public string Icon { get; set; }
//public LargeImage Image { get; set; }
//public ReadOnlyDictionary<string, int> Characteristics { get; private set; }
//private HashSet<Skill> skills = new HashSet<Skill>();
public ReadOnlyCollection<SkinEntity> Skins { get; set; }
} }
} }

@ -7,14 +7,15 @@ using Microsoft.EntityFrameworkCore;
namespace EFLol namespace EFLol
{ {
public class ChampionContext : DbContext public class MyDbContext : DbContext
{ {
public DbSet<ChampionEntity> Champions { get; set; } public DbSet<ChampionEntity> Champions { get; set; }
public DbSet<SkinEntity> Skins { get; set; }
public ChampionContext() public MyDbContext()
{ } { }
public ChampionContext(DbContextOptions<ChampionContext> options) public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options) : base(options)
{ } { }
@ -22,9 +23,15 @@ namespace EFLol
{ {
if (!optionsBuilder.IsConfigured) if (!optionsBuilder.IsConfigured)
{ {
//optionsBuilder.UseSqlServer("Data Source=loldb.db");
optionsBuilder.UseSqlite("Data Source=loldb.db"); optionsBuilder.UseSqlite("Data Source=loldb.db");
} }
} }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ChampionEntity>().Property(c => c.Id).ValueGeneratedOnAdd();
modelBuilder.Entity<SkinEntity>().Property(s => s.Id).ValueGeneratedOnAdd();
}
} }
} }

@ -1,37 +1,67 @@
using EFLol; using System.Collections.ObjectModel;
using EFLol;
/*ChampionEntity Zeus = new ChampionEntity
using (var context = new MyDbContext())
{
// Clean the DB before starting
Console.WriteLine("Clean the DB before starting");
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
}
SkinEntity black = new SkinEntity { Name = "Black", Description = "Black skin", Icon = "black.png", Price = 0.99f };
SkinEntity white = new SkinEntity { Name = "White", Description = "White skin", Icon = "white.png", Price = 150.99f };
SkinEntity green = new SkinEntity { Name = "Green", Description = "Green skin", Icon = "green.png", Price = 4.99f };
ChampionEntity Zeus = new ChampionEntity
{ {
Name = "Zeus", Name = "Zeus",
Bio = "Zeus is the king of the gods." Bio = "Zeus is the god of the sky",
Skins = new ReadOnlyCollection<SkinEntity>(new List<SkinEntity> { black, white })
}; };
ChampionEntity Hera = new ChampionEntity
{
Name = "Hera",
Bio = "Hera is the goddess of marriage",
Skins = new ReadOnlyCollection<SkinEntity>(new List<SkinEntity> { green })
using (var context = new ChampionContext()) };
ChampionEntity Poseidon = new ChampionEntity { Name = "Poseidon", Bio = "Poseidon is the god of the sea" };
using (var context = new MyDbContext())
{ {
Console.WriteLine("Adding Zeus to the database..."); // Crée des champions et les insère dans la base
context.Champions.Add(Zeus); Console.WriteLine("Creates and inserts new Champions");
context.Add(Zeus);
context.Add(Hera);
context.Add(Poseidon);
context.SaveChanges(); context.SaveChanges();
}*/ }
ChampionEntity chewie = new ChampionEntity { Name = "Chewbacca", Bio = "Zeus is the king of the gods." };
ChampionEntity yoda = new ChampionEntity { Name = "Yoda", Bio = "Zeus is the king of the gods." };
ChampionEntity ewok = new ChampionEntity { Name = "Ewok" , Bio = "Zeus is the king of the gods." };
using (var context = new ChampionContext()) using (var context = new MyDbContext())
{ {
// Crée des nounours et les insère dans la base foreach (var n in context.Champions)
Console.WriteLine("Creates and inserts new Nounours"); {
context.Add(chewie); // Use LINQ to display the skins for each champion
context.Add(yoda); var skins = from s in context.Skins
context.Add(ewok); where n.Id == s.Id
context.SaveChanges(); select s;
Console.WriteLine($"Champion n°{n.Id} - {n.Name}");
}
context.SaveChanges();
} }
using (var context = new ChampionContext()) using (var context = new MyDbContext())
{ {
foreach (var n in context.Champions) foreach (var n in context.Skins)
{ {
Console.WriteLine($"{n.Id} - {n.Name}"); Console.WriteLine($"Skin n°{n.Id} - {n.Name}" + (n.Price != null ? $" - {n.Price}" : ""));
} }
context.SaveChanges(); context.SaveChanges();
} }

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EFLol
{
public class SkinEntity
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Icon { get; set; }
public float Price { get; set; }
}
}

@ -1,97 +1,117 @@
using EFLol; using EFLol;
using Microsoft.Data.Sqlite; using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace TestUnitaire namespace TestUnitaire
{ {
public class TestEfLol public class TestEfLol
{ {
[Fact]
public async Task TestAddInMemory() [Theory]
{
// Arrange [InlineData("Zeus", "Dieu de la foudre", true)]
var connection = new SqliteConnection("DataSource=:memory:"); [InlineData("Hades", "Dieu des enfers", true)]
connection.Open(); [InlineData("Aphrodite", "Déesse de l'amour", true)]
[InlineData("AresAresAresAresAresAresAresAresAresAres",
var options = new DbContextOptionsBuilder<ChampionContext>() "Dieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerre" +
.UseSqlite(connection) "Dieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerre" +
.Options; "Dieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerreDieu de la guerre", false)]
public async Task TestAddInMemory(String name, String bio, bool expected)
// Act {
using (var context = new ChampionContext(options)) var connection = new SqliteConnection("DataSource=:memory:");
{ connection.Open();
await context.Database.EnsureCreatedAsync();
var Zeus = new ChampionEntity var options = new DbContextOptionsBuilder<MyDbContext>()
{ .UseSqlite(connection)
Name = "Zeus", .Options;
Bio = "Zeus is the king of the gods."
}; using (var context = new MyDbContext(options))
var Poseidon = new ChampionEntity {
{ await context.Database.EnsureCreatedAsync();
Name = "Poseidon", var Dieu = new ChampionEntity
Bio = "Poseidon is the king of the sea." {
}; Name = name,
Bio = bio
ChampionEntity found = await context.Champions.SingleOrDefaultAsync(c => c.Name == "Zeus"); };
Assert.Null(found);
ChampionEntity found = await context.Champions.SingleOrDefaultAsync(c => c.Name == "Zeus");
await context.Champions.AddAsync(Zeus); Assert.Null(found);
await context.Champions.AddAsync(Poseidon);
await context.SaveChangesAsync(); await context.Champions.AddAsync(Dieu);
await context.SaveChangesAsync();
found = await context.Champions.SingleOrDefaultAsync(c => c.Name == "Zeus");
Assert.NotNull(found); found = await context.Champions.SingleOrDefaultAsync(c => c.Name == name);
Assert.NotNull(found);
Assert.Equal(2, await context.Champions.CountAsync());
Assert.Equal("Zeus", found.Name); Assert.Equal(1, await context.Champions.CountAsync());
} Assert.Equal(name, found.Name);
}
// Test if the max length of the name is respected (30) and the max length of the bio is respected (256)
[Fact] if (expected)
public void ModifyTestInMemory() {
{ Assert.True(found.Name.Length <= 30);
var options = new DbContextOptionsBuilder<ChampionContext>() Assert.True(found.Bio.Length <= 256);
.UseInMemoryDatabase(databaseName: "Modify_Test_database") }
.Options; else
{
//prepares the database with one instance of the context Assert.False(found.Bio.Length <= 256);
Assert.False(found.Name.Length <= 30);
using (var context = new ChampionContext(options)) }
{ }
ChampionEntity chewie = new ChampionEntity { Name = "Chewbacca", Bio = "Zeus is the king of the gods." };
ChampionEntity yoda = new ChampionEntity { Name = "Yoda", Bio = "Zeus is the king of the gods." }; }
ChampionEntity ewok = new ChampionEntity { Name = "Ewok", Bio = "Zeus is the king of the gods." };
[Fact]
context.Champions.Add(chewie); public void ModifyTestInMemory()
context.Champions.Add(yoda); {
context.Champions.Add(ewok); var connection = new SqliteConnection("DataSource=:memory:");
context.SaveChanges(); connection.Open();
}
var options = new DbContextOptionsBuilder<MyDbContext>()
//prepares the database with one instance of the context .UseSqlite(connection)
using (var context = new ChampionContext(options)) .Options;
{
string nameToFind = "ew"; //prepares the database with one instance of the context
Assert.Equal(2, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count()); using (var context = new MyDbContext(options))
nameToFind = "ewo"; {
Assert.Equal(1, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count()); //context.Database.OpenConnection();
var ewok = context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).First(); context.Database.EnsureCreated();
ewok.Name = "Wicket";
context.SaveChanges(); ChampionEntity chewie = new ChampionEntity { Name = "Chewbacca", Bio = "Zeus is the king of the gods." };
} ChampionEntity yoda = new ChampionEntity { Name = "Yoda", Bio = "Zeus is the king of the gods." };
ChampionEntity ewok = new ChampionEntity { Name = "Ewok", Bio = "Zeus is the king of the gods." };
//prepares the database with one instance of the context
using (var context = new ChampionContext(options))
{ context.Champions.Add(chewie);
string nameToFind = "ew"; context.Champions.Add(yoda);
Assert.Equal(1, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count()); context.Champions.Add(ewok);
nameToFind = "wick"; context.SaveChanges();
Assert.Equal(1, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count()); }
}
} //uses another instance of the context to do the tests
} using (var context = new MyDbContext(options))
} {
context.Database.EnsureCreated();
string nameToFind = "ew";
Assert.Equal(2, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count());
nameToFind = "wo";
Assert.Equal(1, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count());
var ewok = context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).First();
ewok.Name = "Wicket";
context.SaveChanges();
}
//uses another instance of the context to do the tests
using (var context = new MyDbContext(options))
{
context.Database.EnsureCreated();
string nameToFind = "ew";
Assert.Equal(1, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count());
nameToFind = "wick";
Assert.Equal(1, context.Champions.Where(n => n.Name.ToLower().Contains(nameToFind)).Count());
}
}
}
}

@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Mvc; using System.Security.Cryptography;
using Microsoft.AspNetCore.Mvc;
using Model; using Model;
// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
@ -116,4 +117,4 @@ namespace apiLOL.Controllers
} }
} }
} }
Loading…
Cancel
Save