Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
170 changes: 170 additions & 0 deletions backend/Tests/CarXPress Unit Tests/ModelosVeiculosControllerTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using RESTful_API.Controllers;
using RESTful_API.Models;
using Xunit;

namespace Unit_Tests
{
public class ModelosVeiculosControllerTests
{
private PdsContext GetDbContextWithData()
{
var options = new DbContextOptionsBuilder<PdsContext>()
.UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
.Options;
var context = new PdsContext(options);

var marca = new MarcaVeiculo { Idmarca = 1, DescMarca = "Marca Test" };
context.MarcaVeiculos.Add(marca);

context.ModeloVeiculos.AddRange(
new ModeloVeiculo { Idmodelo = 1, DescModelo = "Modelo 1", MarcaVeiculoIdmarca = 1 },
new ModeloVeiculo { Idmodelo = 2, DescModelo = "Modelo 2", MarcaVeiculoIdmarca = 1 }
);

context.SaveChanges();
return context;
}

[Fact]
public async Task GetModeloVeiculos_ReturnsAllModelos()
{
// Arrange
var context = GetDbContextWithData();
var controller = new ModelosVeiculosController(context);

// Act
var result = await controller.GetModeloVeiculos();

// Assert
var actionResult = Assert.IsType<ActionResult<IEnumerable<ModeloVeiculo>>>(result);
var modelos = Assert.IsAssignableFrom<IEnumerable<ModeloVeiculo>>(actionResult.Value);
Assert.Equal(2, modelos.Count());
}

[Fact]
public async Task GetModeloVeiculo_ReturnsModelo_WhenIdExists()
{
// Arrange
var context = GetDbContextWithData();
var controller = new ModelosVeiculosController(context);

// Act
var result = await controller.GetModeloVeiculo(1);

// Assert
var actionResult = Assert.IsType<ActionResult<ModeloVeiculo>>(result);
var modelo = Assert.IsType<ModeloVeiculo>(actionResult.Value);
Assert.Equal(1, modelo.Idmodelo);
Assert.Equal("Modelo 1", modelo.DescModelo);
}

[Fact]
public async Task GetModeloVeiculo_ReturnsNotFound_WhenIdDoesNotExist()
{
// Arrange
var context = GetDbContextWithData();
var controller = new ModelosVeiculosController(context);

// Act
var result = await controller.GetModeloVeiculo(999);

// Assert
var actionResult = Assert.IsType<ActionResult<ModeloVeiculo>>(result);
Assert.IsType<NotFoundResult>(actionResult.Result);
}

[Fact]
public async Task PutModeloVeiculo_ReturnsNoContent_WhenUpdateIsSuccessful()
{
// Arrange
var context = GetDbContextWithData();
var controller = new ModelosVeiculosController(context);
var updatedModelo = new ModeloVeiculo { Idmodelo = 1, DescModelo = "Modelo 1 Atualizado", MarcaVeiculoIdmarca = 1 };

// Clean up tracking before updating
context.ChangeTracker.Clear();

// Act
var result = await controller.PutModeloVeiculo(1, updatedModelo);

// Assert
Assert.IsType<NoContentResult>(result);
var dbModelo = await context.ModeloVeiculos.FindAsync(1);

Copilot AI Apr 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FindAsync returns a nullable entity; if the update fails for any reason, this test will throw a NullReferenceException when accessing dbModelo.DescModelo, which makes failures harder to diagnose. Add an explicit Assert.NotNull(dbModelo) (or equivalent) before asserting on its properties.

Suggested change
var dbModelo = await context.ModeloVeiculos.FindAsync(1);
var dbModelo = await context.ModeloVeiculos.FindAsync(1);
Assert.NotNull(dbModelo);

Copilot uses AI. Check for mistakes.
Assert.Equal("Modelo 1 Atualizado", dbModelo.DescModelo);
}

[Fact]
public async Task PutModeloVeiculo_ReturnsBadRequest_WhenIdMismatch()
{
// Arrange
var context = GetDbContextWithData();
var controller = new ModelosVeiculosController(context);
var updatedModelo = new ModeloVeiculo { Idmodelo = 2, DescModelo = "Modelo 2 Atualizado", MarcaVeiculoIdmarca = 1 };

// Act
var result = await controller.PutModeloVeiculo(1, updatedModelo); // URL ID is 1, but Object ID is 2

// Assert
Assert.IsType<BadRequestResult>(result);
}
Comment on lines +82 to +115

Copilot AI Apr 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PutModeloVeiculo in the controller has a NotFound() branch for missing entities (via DbUpdateConcurrencyException + ModeloVeiculoExists), but this test suite doesn't exercise that behavior. Note that UseInMemoryDatabase often won't reproduce relational concurrency behavior for “update missing row”, so this branch can be hard to validate with the current provider; if you want to cover it, consider switching this specific test to a relational in-memory provider (e.g., SQLite in-memory).

Copilot uses AI. Check for mistakes.

[Fact]
public async Task PostModeloVeiculo_ReturnsCreatedResponse_WhenValid()
{
// Arrange
var context = GetDbContextWithData();
var controller = new ModelosVeiculosController(context);
var newModelo = new ModeloVeiculo { Idmodelo = 3, DescModelo = "Modelo 3", MarcaVeiculoIdmarca = 1 };

// Act
var result = await controller.PostModeloVeiculo(newModelo);

// Assert
var actionResult = Assert.IsType<ActionResult<ModeloVeiculo>>(result);
var createdAtActionResult = Assert.IsType<CreatedAtActionResult>(actionResult.Result);
Assert.Equal("GetModeloVeiculo", createdAtActionResult.ActionName);
var returnValue = Assert.IsType<ModeloVeiculo>(createdAtActionResult.Value);
Assert.Equal(3, returnValue.Idmodelo);

// Verify it was added to the DB
var dbModelo = await context.ModeloVeiculos.FindAsync(3);
Assert.NotNull(dbModelo);
}

[Fact]
public async Task DeleteModeloVeiculo_ReturnsNoContent_WhenDeleted()
{
// Arrange
var context = GetDbContextWithData();
var controller = new ModelosVeiculosController(context);

// Act
var result = await controller.DeleteModeloVeiculo(1);

// Assert
Assert.IsType<NoContentResult>(result);
var dbModelo = await context.ModeloVeiculos.FindAsync(1);
Assert.Null(dbModelo);
}

[Fact]
public async Task DeleteModeloVeiculo_ReturnsNotFound_WhenIdDoesNotExist()
{
// Arrange
var context = GetDbContextWithData();
var controller = new ModelosVeiculosController(context);

// Act
var result = await controller.DeleteModeloVeiculo(999);

// Assert
Assert.IsType<NotFoundResult>(result);
}
}
}