diff --git a/MBDEVproAPI.API/Controllers/CustomerController.cs b/MBDEVproAPI.API/Controllers/CustomerController.cs index 7792e26..df85ccd 100644 --- a/MBDEVproAPI.API/Controllers/CustomerController.cs +++ b/MBDEVproAPI.API/Controllers/CustomerController.cs @@ -106,7 +106,7 @@ public async Task> GetCustomerAsync(int CustomerID) - #region Add Customer + #region Create Customer /// /// Add Customer | CustomerViewModel | Create a new customer for a business from client web application using a CustomerViewModel. /// @@ -115,19 +115,22 @@ public async Task> GetCustomerAsync(int CustomerID) [HttpPost] public async Task CreateCustomerVMAsync([FromBody] CustomerViewModel vm) { - return Ok(_customerService.CreateCustomerVMAsync(vm)); + var result = await _customerService.CreateCustomerVMAsync(vm); + return Ok(result); } /// /// Add Customer | CustomerModel | Create a new customer for a business. + /// TEST URL: https://localhost:7092/api/Customer/CreateCustomer /// /// /// [HttpPost] public async Task CreateCustomerAsync([FromBody] CustomerModel model) { - return Ok(_customerService.CreateCustomerAsync(model)); + var result = await _customerService.CreateCustomerAsync(model); + return Ok(result); //return Ok("UNDER CONTRUCTION | CreateCustomerAsync([FromBody] Customer model)"); } #endregion @@ -142,27 +145,30 @@ public async Task CreateCustomerAsync([FromBody] CustomerModel mo /// "CustomerControllerEditCustomerVMAsync": "Customer/EditCustomerVMAsync", /// /// - /// CustomerViewModel + /// SaveViewModel [HttpPost] public async Task EditCustomerVMAsync([FromBody] CustomerViewModel vm) { // if model is valid, then update, else return bad request with model state errors. - return Ok(_customerService.EditCustomerVMAsync(vm)); + var result = await _customerService.EditCustomerVMAsync(vm); + return Ok(result); //return Ok("UNDER CONTRUCTION | EditCustomer(int id, [FromBody] Customer model)"); } /// /// EDIT: Customer | CustomerModel | edit a customer for a business. + /// TEST URL: https://localhost:7092/api/Customer/EditCustomer?id=5 /// "CustomerControllerEditCustomer": "Customer/EditCustomer" /// /// /// [HttpPost] - public async Task EditCustomer(int id, [FromBody] CustomerModel model) + public async Task EditCustomer([FromBody] CustomerModel model) { // if model is valid, then update, else return bad request with model state errors. - return Ok(_customerService.EditCustomer(model)); + var result = await _customerService.EditCustomer(model); + return Ok(result); } // CustomerModel to just return a CustomerModel instead of a SaveViewModel with the RefID. We could do this for the VM as well. @@ -172,56 +178,19 @@ public async Task EditCustomer(int id, [FromBody] CustomerModel m #region Delete Customer /// - /// DELET: Customer | CustomerModel | Delete a customer for a business. - /// "CustomerControllerDeleteCustomer": "Customer/DeleteCustomer" + /// DELETE: Customer | SaveViewModel | delete a customer for a business and return a SaveViewModel with the RefID of the deleted customer. + /// "CustomerControllerDeleteCustomerVMAsync": "Customer/DeleteCustomerVMAsync" /// /// - /// - [HttpDelete("{id:int}")] - public async Task DeleteCustomer(int id) + /// SaveViewModel + [HttpDelete("{CustomerID:int}")] + public async Task DeleteCustomerVMAsync(int CustomerID)// LOOK AT ALL THESE IN CONTROLLER COMPAARED TO LICENSE API, WE JUST USE ACTION RESULT HERE AND RETURN THE MODEL THAT IS IN THE SERVICE. { - return Ok(_customerService.DeleteCustomer(id)); - } + var result = await _customerService.DeleteCustomerVMAsync(CustomerID); + return Ok(result); + } #endregion - - - //#region DELETE: Citation Type - ///// - ///// DELETE: Citation Type - ///// "CitationTypeControllerDeleteCitationType": "CitationType/DeleteCitationType" - ///// - ///// - ///// - //[HttpDelete("{CitationTypeID:int}")] - //public IActionResult DeleteCitationType(int CitationTypeID) - //{ - // return Ok(_citationTypeService.DeleteCitationType(CitationTypeID)); - //} - //#endregion - - //// DELETE: api/Customer/5 - //[HttpDelete("{id}")] - //public async Task DeleteCustomer(int id) - //{ - // var customer = await _context.Customers.FindAsync(id); - // if (customer == null) - // { - // return NotFound(); - // } - - // _context.Customers.Remove(customer); - // await _context.SaveChangesAsync(); - - // return NoContent(); - //} - - //private bool CustomerExists(int id) - //{ - // return _context.Customers.Any(e => e.CustomerID == id); - //} - } - } diff --git a/MBDEVproAPI.API/GlobalUsings.cs b/MBDEVproAPI.API/GlobalUsings.cs index 1fb1a1e..ea436fa 100644 --- a/MBDEVproAPI.API/GlobalUsings.cs +++ b/MBDEVproAPI.API/GlobalUsings.cs @@ -23,5 +23,6 @@ //global using Microsoft.OpenApi.Models; global using Serilog; global using Serilog.Formatting.Json; -global using Microsoft.OpenApi; +global using Microsoft.OpenApi; +global using Scalar.AspNetCore; diff --git a/MBDEVproAPI.API/MBDEVproAPI.API.csproj b/MBDEVproAPI.API/MBDEVproAPI.API.csproj index f2b34cb..ab80dc1 100644 --- a/MBDEVproAPI.API/MBDEVproAPI.API.csproj +++ b/MBDEVproAPI.API/MBDEVproAPI.API.csproj @@ -7,15 +7,15 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + @@ -23,8 +23,10 @@ - - + + + + diff --git a/MBDEVproAPI.API/Program.cs b/MBDEVproAPI.API/Program.cs index ea158c6..c9b8cd6 100644 --- a/MBDEVproAPI.API/Program.cs +++ b/MBDEVproAPI.API/Program.cs @@ -1,7 +1,12 @@ +var builder = WebApplication.CreateBuilder(args); +var logger = new LoggerConfiguration() + .ReadFrom.Configuration(builder.Configuration) + .Enrich.FromLogContext() + .CreateLogger(); +builder.Host.UseSerilog(logger); + -using Scalar.AspNetCore; -var builder = WebApplication.CreateBuilder(args); //DATABASE CONNECTION builder.Services.AddDbContext(options => @@ -45,16 +50,33 @@ var app = builder.Build(); +app.UseSerilogRequestLogging(); + + // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { - app.MapOpenApi(); // Expose the OpenAPI JSON endpoint - app.MapScalarApiReference(); // Map the Scalar UI endpoint + //app.MapOpenApi(); // Expose the OpenAPI JSON endpoint + //app.MapScalarApiReference(); // Map the Scalar UI endpoint + + app.MapOpenApi(); + app.MapScalarApiReference(); + //app.MapScalarApiReference(options => + //{ + // options.Title = "MBDEVproAPI v1 .NET CORE 10"; + // options.WithTheme(ScalarTheme.Moon); // Use a specific theme + // options.ForceDarkMode(); // Force dark mode + //}); + + // Automatically redirect to Scalar documentation + //app.MapGet("/", () => Results.Redirect("/scalar")); Log.Information("MBDEVproAPI: (Development Environment)"); app.UseDeveloperExceptionPage(); } + + if (app.Environment.EnvironmentName == "Test") { Log.Information("MBDEVproAPI: Test Environment)"); @@ -70,31 +92,29 @@ Log.Information("MBDEVproAPI: Production Environment)"); } -if (app.Environment.IsDevelopment() || app.Environment.EnvironmentName == "Test") -{ - app.UseSwagger(); - app.UseSwaggerUI(c => - { - //c.SwaggerEndpoint("/MBDEVproAPI/swagger/v1/swagger.json", "MBDEVproAPI v1 .NET CORE 10"); - c.SwaggerEndpoint("../swagger/v1/swagger.json", "MBDEVproAPI v1 .NET CORE 10"); - // ENDPOINTS: https://localhost:7092/swagger/index.html - // JSON: https://localhost:7092/swagger/v1/swagger.json - }); -} - -app.MapScalarApiReference(options => -{ - options.Title = "MBDEVproAPI v1 .NET CORE 10"; - options.WithTheme(ScalarTheme.Moon); // Use a specific theme - options.ForceDarkMode(); // Force dark mode -}); +//if (app.Environment.IsDevelopment() || app.Environment.EnvironmentName == "Test") +//{ +// //app.UseSwagger(); +// //app.UseSwaggerUI(c => +// //{ +// // //c.SwaggerEndpoint("/MBDEVproAPI/swagger/v1/swagger.json", "MBDEVproAPI v1 .NET CORE 10"); +// // c.SwaggerEndpoint("../swagger/v1/swagger.json", "MBDEVproAPI v1 .NET CORE 10"); +// // // ENDPOINTS: https://localhost:7092/swagger/index.html +// // // JSON: https://localhost:7092/swagger/v1/swagger.json +// //}); +//} +Log.Information("MBDEVproAPI: (Development Environment)"); +app.UseSerilogRequestLogging(); // Add Serilog request logging middleware +app.UseDeveloperExceptionPage(); // For local only, can change later for testing and production environments, can also add custom error handling middleware for production environment. //Middleware app.UseHttpsRedirection(); +app.UseStaticFiles(); + app.UseAuthorization(); app.MapControllers(); diff --git a/MBDEVproAPI.API/appsettings.Development.json b/MBDEVproAPI.API/appsettings.Development.json index 720c196..186a07e 100644 --- a/MBDEVproAPI.API/appsettings.Development.json +++ b/MBDEVproAPI.API/appsettings.Development.json @@ -1,14 +1,12 @@ { "ConnectionStrings": { - //"DefaultConnection": "Server=ComputerPro7.local;Database=MBDEVproDB;Trusted_Connection=True;MultipleActiveResultSets=true", - // Use Secrets if passwords and so on... - "DefaultConnection": "Server=COMPUTERPRO7\\MSSQLSERVER2025;Initial Catalog=MBDEVproDB;Integrated Security=True;Encrypt=False;Trust Server Certificate=True" + "DefaultConnection": "Server=COMPUTERPRO7\\MSSQLSERVER2025;Initial Catalog=MBDEVproDB;Integrated Security=True;Encrypt=False;Trust Server Certificate=True" }, "APISettings": { //"APIUrl": "https://localhost:7092/api/Customer/", //"AuthenticateUrl": "Account/Login", - //"ProjectID": "0", + //"BusinessID": "0", //"IsUserExist": "Account/IsUserExist" }, @@ -16,7 +14,7 @@ "DefaultProjectSettings": { "ProjectName": "MBDEVproAPI", "Description": "MBDEVproAPI version .NET CORE 10", - "DefaultFinishInspectionsStatus": "COMPLETED", + "SomeKey": "xcxc", "SessionTimeout": "900000", "ApplicationURL": "https://www.google.com", "JSReport_TimeOutValue": "200000000", @@ -35,26 +33,37 @@ "BaseUri": "https://localhost:7092/api/Customer/", "ValidateTokenUri": "Auth/ValidateAppAccessToken" }, - "AllowedHosts": "*", - "Serilog": { - "Using": [ "Serilog.Exceptions" ], - "MinimumLevel": { - "Default": "Debug", - "Override": { - "Microsoft": "Warning", - "System": "Warning" - } - }, - "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId", "WithExceptionDetails" ], - "WriteTo": [ - { - "Name": "ApplicationInsights", - "Args": { - "connectionString": "InstrumentationKey=xxxxx;IngestionEndpoint=https://MBDEVproAPI.applicationinsights.azure.com/;LiveEndpoint=https://MBDEVproAPI.livediagnostics.monitor.azure.com/;ApplicationId=xxxxx", - "telemetryConverter": "Serilog.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights" + "HttpsRedirection": { + "Enabled": true, + "SSLPort": 443 + }, + "AllowedHosts": "*", + "Serilog": { + "Using": [ "Serilog.Exceptions" ], + "MinimumLevel": { + "Default": "Debug", + "Override": { + "Microsoft": "Warning", + "System": "Warning" } - } - - ] - } -} \ No newline at end of file + }, + "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId", "WithExceptionDetails" ], + "WriteTo": [ + { "Name": "Console" }, + { + "Name": "File", + "Args": { + "path": "X:\\Logs\\MBDEVpro\\MBDEVproAPI\\Development\\log.txt", + "outputTemplate": "{Timestamp:G} {Message}{NewLine:1}{Exception:1}" + } + }, + { + "Name": "File", + "Args": { + "path": "X:\\Logs\\MBDEVpro\\MBDEVproAPI\\Development\\log.json", + "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog" + } + } + ] + } + } \ No newline at end of file diff --git a/MBDEVproAPI.API/appsettings.json b/MBDEVproAPI.API/appsettings.json index 10f68b8..8c3ffb4 100644 --- a/MBDEVproAPI.API/appsettings.json +++ b/MBDEVproAPI.API/appsettings.json @@ -5,5 +5,9 @@ "Microsoft.AspNetCore": "Warning" } }, + "HttpsRedirection": { + "Enabled": true, + "SSLPort": 443 + }, "AllowedHosts": "*" } diff --git a/MBDEVproAPI.API/dotnet-tools.json b/MBDEVproAPI.API/dotnet-tools.json new file mode 100644 index 0000000..b6f4c2f --- /dev/null +++ b/MBDEVproAPI.API/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "10.0.5", + "commands": [ + "dotnet-ef" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/MBDEVproAPI.BLL/Interfaces/ICustomerService.cs b/MBDEVproAPI.BLL/Interfaces/ICustomerService.cs index 470b8d2..f8a90a1 100644 --- a/MBDEVproAPI.BLL/Interfaces/ICustomerService.cs +++ b/MBDEVproAPI.BLL/Interfaces/ICustomerService.cs @@ -43,8 +43,8 @@ public interface ICustomerService : IBaseService #region Delete Customer - Task DeleteCustomerVM(int CustomerID); - SaveViewModel DeleteCustomer(int CustomerID); + Task DeleteCustomerVMAsync(int CustomerID); + Task DeleteCustomer(int CustomerID); #endregion } } diff --git a/MBDEVproAPI.BLL/MBDEVproAPI.BLL.csproj b/MBDEVproAPI.BLL/MBDEVproAPI.BLL.csproj index 1cb3782..de74504 100644 --- a/MBDEVproAPI.BLL/MBDEVproAPI.BLL.csproj +++ b/MBDEVproAPI.BLL/MBDEVproAPI.BLL.csproj @@ -7,7 +7,7 @@ - + @@ -16,6 +16,8 @@ + + diff --git a/MBDEVproAPI.BLL/Services/CustomerService.cs b/MBDEVproAPI.BLL/Services/CustomerService.cs index 40d1692..74028ca 100644 --- a/MBDEVproAPI.BLL/Services/CustomerService.cs +++ b/MBDEVproAPI.BLL/Services/CustomerService.cs @@ -289,7 +289,7 @@ public async Task EditCustomerVMAsync(CustomerViewModel vm) if (entity == null) { Log.Error("Customer API: CustomerService(EditCustomerVMAsync); (entity == null)"); - return new SaveViewModel { IsSaved = false, ErrorMessage = "Please provide details to Edit the Customer." }; + return new SaveViewModel { IsSaved = false, ErrorMessage = "Please provide details to Edit the Customer. (entity == null)" }; } else { @@ -328,7 +328,7 @@ public async Task EditCustomer(CustomerModel model) if (model == null || model.CustomerID == 0 || model.BusinessID == 0) { Log.Error("Customer API: CustomerService(EditCustomer) CustomerModel; (model == null || model.CustomerID == 0 || model.BusinessID == 0)"); - return new SaveViewModel { IsSaved = false, ErrorMessage = "Please provide details to Edit the Customer." }; + return new SaveViewModel { IsSaved = false, ErrorMessage = "Please provide details to Edit the Customer. Null Values" }; } else { @@ -341,11 +341,12 @@ public async Task EditCustomer(CustomerModel model) else { int? refID; + refID = entity.CustomerID; using (TransactionScope scope = new TransactionScope()) { Mapper.MapObject(model, entity); _customerRepository.SaveChanges(); - refID = entity.CustomerID; + //refID = entity.CustomerID; scope.Complete(); } return new SaveViewModel(refID); @@ -374,14 +375,14 @@ public async Task EditCustomer(CustomerModel model) /// /// /// SaveViewModel - public async Task DeleteCustomerVM(int CustomerID) + public async Task DeleteCustomerVMAsync(int CustomerID) { try { int? refID = null; if (CustomerID == 0) { - Log.Error("Customer API: CustomerService(DeleteCustomerVM); (CustomerID == 0)"); + Log.Error("Customer API: CustomerService(DeleteCustomerVMAsync); (CustomerID == 0)"); return new SaveViewModel("Please provide details to delete the Customer."); } else @@ -390,7 +391,7 @@ public async Task DeleteCustomerVM(int CustomerID) if (entity == null) { - Log.Error("Customer API: CustomerService(DeleteCustomerVM); (entity == null)"); + Log.Error("Customer API: CustomerService(DeleteCustomerVMAsync); (entity == null)"); return new SaveViewModel("Please provide details to delete the Customer."); } else @@ -408,30 +409,47 @@ public async Task DeleteCustomerVM(int CustomerID) } catch (Exception ex) { - Log.Error("Customer API: CustomerService(EditCustomer) CustomerModel; (" + ex + ")" + " (" + ex.InnerException + ")"); - return new SaveViewModel(ex.Message); + Log.Error("Customer API: CustomerService(DeleteCustomerVMAsync); (" + ex + ")" + " (" + ex.InnerException + ")"); + return new SaveViewModel("Customer API: CustomerService(DeleteCustomerVMAsync); (" + ex + ")" + " (" + ex.InnerException + ") Message: " + ex.Message); } finally { } - return new SaveViewModel("Customer API: CustomerService(DeleteCustomer); (SaveViewModel) Not Yet Implemented."); } /// - /// DELETE: Customer | CustomerModel | delete a customer for a business and return a SaveViewModel with the RefID of the deleted customer. - /// "CustomerControllerDeleteCustomerVM": "Customer/DeleteCustomerVM" + /// DELETE: Customer | CustomerModel | delete a customer for a business. + /// "CustomerControllerDeleteCustomer": "Customer/DeleteCustomer" /// /// /// SaveViewModel - public CustomerModel DeleteCustomer(int CustomerID) - { - throw new NotImplementedException(); - // return new SaveViewModel("Customer API: CustomerService(DeleteCustomer); (SaveViewModel) Not Yet Implemented."); - } - - SaveViewModel ICustomerService.DeleteCustomer(int CustomerID) - { - throw new NotImplementedException(); + public async Task DeleteCustomer(int CustomerID) + { // More to do here + if (CustomerID == 0) + { + Log.Error("Customer API: CustomerService(DeleteCustomer); (CustomerID == 0)"); + return new CustomerModel(); + } + else { + var entity = await _customerRepository.GetCustomerAsync(CustomerID); + if (entity == null) + { + Log.Error("Customer API: CustomerService(DeleteCustomer); (entity == null)"); + return new CustomerModel(); + } + else + { + int? refID = null; + using (TransactionScope scope = new TransactionScope()) + { + _customerRepository.Remove(entity); + _customerRepository.SaveChanges(); + scope.Complete(); + refID = entity.CustomerID; + } + return Mapper.MapObject(entity, new CustomerModel()); + } + } } #endregion diff --git a/MBDEVproAPI.Repository/Class1.cs b/MBDEVproAPI.Repository/Class1.cs deleted file mode 100644 index ddcf26a..0000000 --- a/MBDEVproAPI.Repository/Class1.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MBDEVproAPI.Repository -{ - public class Class1 - { - - } -} diff --git a/MBDEVproAPI.Tests/CustomerTests.cs b/MBDEVproAPI.Tests/CustomerTests.cs new file mode 100644 index 0000000..fce719d --- /dev/null +++ b/MBDEVproAPI.Tests/CustomerTests.cs @@ -0,0 +1,147 @@ +using Microsoft.EntityFrameworkCore.Metadata.Internal; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using static Microsoft.EntityFrameworkCore.DbLoggerCategory; + +namespace MBDEVproAPI.Tests +{ + public class CustomerTests + { + + #region Variables and Constructors + + private ICustomerService _customerService; + + #endregion + + public CustomerTests(ICustomerService customerService) { + + _customerService = customerService; + + } + + + //using MBDEVproAPI.DataModel.Entities; + private static readonly List _customerListEntity = new() + { new Customer { CustomerID = 1, BusinessID = 52466, Company = "cheeseburger", FirstName = "Jeff", LastName = "Smith", Email = "Jeff@Smith.com", Address = "123 Test St" } + }; + + + //using MBDEVproAPI.Common.Models; + private static readonly List _customerListModel = new() + { new CustomerModel { CustomerID = 1, BusinessID = 52466, Company = "cheeseburger", FirstName = "Jeff", LastName = "Smith", Email = "Jeff@Smith.com", Address = "123 Test St" } + }; + + + #region commented out code + //public int CustomerID { get; set; } + //public int BusinessID { get; set; } + + //public string? Company { get; set; } + //public string FirstName { get; set; } = String.Empty; + //public string LastName { get; set; } = String.Empty; + + //public string Email { get; set; } = String.Empty; + + //public string? Title { get; set; } + //public string? BPhone { get; set; } + //public string? HPhone { get; set; } + //public string? MPhone { get; set; } + //public string? Fax { get; set; } + + //public string Address { get; set; } = String.Empty; + //public string City { get; set; } = String.Empty; + //public string State { get; set; } = String.Empty; + //public string ZIPCode { get; set; } = String.Empty; + //public string Country { get; set; } = String.Empty; + + //public string? WebPage { get; set; } + //public string? Notes { get; set; } + //public string? Photo { get; set; } + //public string? Map { get; set; } + + //public CustomerTests() + //{ + // var mock = new Mock(); + // mock.Setup(s => s.GetCustomerAsync(It.IsAny())) + // .ReturnsAsync((int id) => _customerListEntity.FirstOrDefault(c => c.CustomerID == id) ?? new Customer()); + // mock.Setup(s => s.GetAllCustomersVMAsync(It.IsAny())) + // .ReturnsAsync((int businessId) => new CustomerViewModel { CustomerList = _customerListEntity.Select(x => Mapper.MapObject(x, new CustomerModel())).ToList() }); + // _customerService = mock.Object; + //} + + + //public class CustomerTests + //{ + // private ICustomerService _customerService; + + // public CustomerTests() + // { + // _customerService = new TestCustomerService(); + // } + + // private static readonly List _customerListEntity = new() + // { + // new Customer { CustomerID = 1, BusinessID = 52466, Company = "cheeseburger", FirstName = "Jeff", LastName = "Smith", Email = "Jeff@Smith.com", Address = "123 Test St" } + // }; + + // // Simple test-only implementation + // private class TestCustomerService : ICustomerService + // { + // public Task GetCustomerAsync(int CustomerID) + // { + // var c = _customerListEntity.FirstOrDefault(x => x.CustomerID == CustomerID); + // return Task.FromResult(c ?? new Customer()); + // } + + // public Task GetAllCustomersVMAsync(int BusinessID) + // { + // var vm = new CustomerViewModel { CustomerList = _customerListEntity.Select(x => Mapper.MapObject(x, new CustomerModel())).ToList() }; + // return Task.FromResult(vm); + // } + + // // Implement other members of ICustomerService as no-op or throw NotImplementedException + // // ... + // } + + // // tests follow... + //} + #endregion + + + + #region Tests + + [Fact] + public async Task GetCustomerAsync() + { + var customer = await _customerService.GetCustomerAsync(3); + Assert.NotNull(customer); + } + + [Theory] + [InlineData(1)] + [InlineData(2)] + [InlineData(3)] + [InlineData(4)] + [InlineData(5)] + public async Task GetCustomerAsyncID(int id) + { + var customer = await _customerService.GetCustomerAsync(id); + Assert.NotNull(customer); + } + + + [Theory] + [InlineData(52466)] + public async Task GetAllCustomersVMAsyncTest(int id) + { + var customers = await _customerService.GetAllCustomersVMAsync(id); + Assert.NotNull(customers); + } + + #endregion + + + } +} diff --git a/MBDEVproAPI.Tests/GlobalUsings.cs b/MBDEVproAPI.Tests/GlobalUsings.cs new file mode 100644 index 0000000..7f3ce43 --- /dev/null +++ b/MBDEVproAPI.Tests/GlobalUsings.cs @@ -0,0 +1,27 @@ +global using System; +global using System.Collections.Generic; +//global using MBDEVproAPI.BLL.Interfaces; +//global using MBDEVproAPI.BLL.Services; +global using MBDEVproAPI.Common.Models; +global using MBDEVproAPI.Common.ViewModels; +global using MBDEVproAPI.BLL.Interfaces; +global using MBDEVproAPI.BLL.Services; +global using MBDEVproAPI.DataModel; +global using MBDEVproAPI.DataModel.Entities; +global using MBDEVproAPI.Repository.Interfaces; +global using MBDEVproAPI.Repository.Repositories; +global using Microsoft.AspNetCore.Authorization; +global using Microsoft.AspNetCore.Builder; +global using Microsoft.AspNetCore.Hosting; +global using Microsoft.AspNetCore.Http; +global using Microsoft.AspNetCore.Mvc; +global using Microsoft.AspNetCore.Mvc.Filters; +global using Microsoft.EntityFrameworkCore; +global using Microsoft.Extensions.Configuration; +global using Microsoft.Extensions.DependencyInjection; +global using Microsoft.Extensions.Hosting; +//global using Microsoft.OpenApi.Models; +global using Serilog; +global using Serilog.Formatting.Json; +global using Microsoft.OpenApi; +global using Scalar.AspNetCore; \ No newline at end of file diff --git a/MBDEVproAPI.Tests/MBDEVproAPI.Tests.csproj b/MBDEVproAPI.Tests/MBDEVproAPI.Tests.csproj index b6e61fc..cec5f9c 100644 --- a/MBDEVproAPI.Tests/MBDEVproAPI.Tests.csproj +++ b/MBDEVproAPI.Tests/MBDEVproAPI.Tests.csproj @@ -8,10 +8,18 @@ - - - - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/MBDEVproAPI.Tests/UnitTest1.cs b/MBDEVproAPI.Tests/UnitTest1.cs deleted file mode 100644 index dc26341..0000000 --- a/MBDEVproAPI.Tests/UnitTest1.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MBDEVproAPI.Tests -{ - public class UnitTest1 - { - [Fact] - public void Test1() - { - - } - } -} diff --git a/README.md b/README.md index 4cde91b..4505254 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ -# MBDEVproAPI \ No newline at end of file +# MBDEVproAPI +A .NET CORE 10 web api using N-Tier Architecture and the Repository Pattern.