Compare commits

...

52 Commits

Author SHA1 Message Date
Tony Fages e20c8bedc1 Mise à jour de '.drone.yml'
10 months ago
Tony Fages 434deead41 test console connect to API
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages c2a5d84d9a Merge branch 'master' of codefirst.iut.uca.fr:Verax/Verax_API_EF
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 7d05e23d56 fix bug Auth + add Console Tests on deploid API 🐛
1 year ago
Tony Fages 44edfe4bbb Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 50e52b317c ADD tests for API
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages c9d7db1ff6 fix bugs
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 36ffb41b4c Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages c42fef890a Merge pull request 'rebase' (#3) from rebase into master
continuous-integration/drone/push Build is failing Details
1 year ago
Tony Fages c75ba9a586 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 9922a67ad4 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
1 year ago
Tony Fages 29dee05875 rebase
continuous-integration/drone/push Build is failing Details
1 year ago
Tony Fages 25630b42bb Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
1 year ago
Tony Fages 3439fac9e1 docker
continuous-integration/drone/push Build is failing Details
1 year ago
Tony Fages 3220d6acaf Dockerfile
continuous-integration/drone/push Build was killed Details
1 year ago
Tony Fages 98bfdf73a3 Merge remote-tracking branch 'origin/master'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages ecf0fb2fb6 drone
1 year ago
Louis LABORIE 550a4b86ff Supprimer 'Verax_API_EF/.gitignore'
continuous-integration/drone/push Build is failing Details
1 year ago
Louis LABORIE fc8b419bd6 Supprimer 'Verax_API_EF/README.md'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages c2a5696f1c Mise à jour de 'Verax_API_EF/Verax_API_EF/API/Properties/launchSettings.json'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 66ea1fb216 Mise à jour de 'Verax_API_EF/Dockerfile'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages dc96308ed7 docker
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages b161253b1a docker
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 1a6b1ed501 Mise à jour de 'Verax_API_EF/Verax_API_EF/API/Properties/launchSettings.json'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 1a7adcf6eb Mise à jour de 'Verax_API_EF/Verax_API_EF/API/Program.cs'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 96ee1e295f Mise à jour de 'Verax_API_EF/Dockerfile'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 4ba3c0a93a Mise à jour de 'Verax_API_EF/Dockerfile'
continuous-integration/drone/push Build is passing Details
1 year ago
Louis LABORIE 3398be5283 Try to run CD jobs 🐛🐛
continuous-integration/drone/push Build is passing Details
1 year ago
Louis LABORIE d891d2bbc2 Try to run CD jobs 🐛🐛
continuous-integration/drone/push Build is failing Details
1 year ago
Louis LABORIE 50046a5a06 Try to run CD jobs 🐛🐛
continuous-integration/drone/push Build is failing Details
1 year ago
Louis LABORIE 4ca93abf8f Try to run CD jobs 🐛🐛
continuous-integration/drone/push Build is failing Details
1 year ago
Louis LABORIE 7ddc3151c9 Try to run CD jobs 🐛🐛
continuous-integration/drone/push Build is failing Details
1 year ago
Louis LABORIE f7d45c6883 Try to run CD jobs 🐛🐛
continuous-integration/drone/push Build encountered an error Details
1 year ago
Louis LABORIE b8984a52fd Try to run CD jobs 🐛🐛
continuous-integration/drone/push Build encountered an error Details
1 year ago
Louis LABORIE 5def181a5d Try to run CD jobs 🐛🐛
continuous-integration/drone/push Build encountered an error Details
1 year ago
Tony Fages a786b4c071 Add some Tests
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages c4bfac2f9a Merge branch 'master' of codefirst.iut.uca.fr:Verax/Verax_API_EF
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 610ccb8284 fix bugs 🐛
1 year ago
Tony Fages 34d978ece1 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 89c4de82c8 Merge branch 'master' of codefirst.iut.uca.fr:Verax/Verax_API_EF
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 425c7f8401 fix bugs 🐛
1 year ago
Tony Fages 5298b5d948 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 0e8c78c0c0 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages cf571aa86a Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages f283d29798 add img for read me
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 43d3dff30c Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 0affdd11d4 Merge branch 'testTony'
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 13a92d070d Add some Tests
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 205919227c Add some Tests
continuous-integration/drone/push Build is passing Details
1 year ago
Louis LABORIE e8a6d8a7fb Fix Coverage Exclusions 🍻🍻
continuous-integration/drone/push Build is passing Details
1 year ago
Louis LABORIE 15e053c2f5 Merge pull request 'testsLouis' (#2) from testsLouis into master
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 209f691158 Merge branch 'master' of codefirst.iut.uca.fr:Verax/Verax_API_EF
continuous-integration/drone/push Build is passing Details
1 year ago

@ -1,6 +1,6 @@
kind: pipeline kind: pipeline
type: docker type: docker
name: CI name: default
trigger: trigger:
event: event:
@ -10,7 +10,6 @@ steps:
- name: build - name: build
image: mcr.microsoft.com/dotnet/sdk:8.0 image: mcr.microsoft.com/dotnet/sdk:8.0
commands: commands:
- cd Verax_API_EF
- cd Verax_API_EF - cd Verax_API_EF
- dotnet restore Verax_API_EF.sln - dotnet restore Verax_API_EF.sln
- dotnet build Verax_API_EF.sln -c Release --no-restore - dotnet build Verax_API_EF.sln -c Release --no-restore
@ -19,7 +18,6 @@ steps:
- name: tests - name: tests
image: mcr.microsoft.com/dotnet/sdk:8.0 image: mcr.microsoft.com/dotnet/sdk:8.0
commands: commands:
- cd Verax_API_EF
- cd Verax_API_EF - cd Verax_API_EF
- dotnet restore Verax_API_EF.sln - dotnet restore Verax_API_EF.sln
- dotnet test Verax_API_EF.sln --no-restore - dotnet test Verax_API_EF.sln --no-restore
@ -34,10 +32,9 @@ steps:
from_secret: SECRET_SONAR_LOGIN # Secret de Drone from_secret: SECRET_SONAR_LOGIN # Secret de Drone
project_key: Verax_API_EF project_key: Verax_API_EF
commands: commands:
- cd Verax_API_EF/
- cd Verax_API_EF/ - cd Verax_API_EF/
- dotnet restore Verax_API_EF.sln - dotnet restore Verax_API_EF.sln
- dotnet sonarscanner begin /k:$${project_key} /d:sonar.host.url=$${sonar_host} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions="Unit_Test_EF/**","API_Unit_Test/**","API_Tests_Console/**","Test_Console_EF/**","DbContextLib/Migrations/**","StubbedContextLib/**" /d:sonar.login=$${sonar_token} - dotnet sonarscanner begin /k:$${project_key} /d:sonar.host.url=$${sonar_host} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions="Unit_Test_EF/**","API_Unit_Test/**","API_Tests_Console/**","Test_Console_EF/**","DbContextLib/Migrations/**","StubbedContextLib/**","API/Program.cs","DbContextLib/ApplicationDbContext.cs" /d:sonar.login=$${sonar_token}
- dotnet build Verax_API_EF.sln -c Release --no-restore - dotnet build Verax_API_EF.sln -c Release --no-restore
- dotnet test Verax_API_EF.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage" - dotnet test Verax_API_EF.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage"
- reportgenerator -reports:"**/coverage.cobertura.xml" -reporttypes:SonarQube -targetdir:"coveragereport" - reportgenerator -reports:"**/coverage.cobertura.xml" -reporttypes:SonarQube -targetdir:"coveragereport"
@ -50,3 +47,32 @@ steps:
- push - push
- pull_request - pull_request
depends_on: [build,tests] depends_on: [build,tests]
- name: docker-build-and-push
image: plugins/docker
settings:
dockerfile: Verax_API_EF/Dockerfile
context: Verax_API_EF
registry: hub.codefirst.iut.uca.fr
repo: hub.codefirst.iut.uca.fr/louis.laborie/sae_2a_api_ef
username:
from_secret: SECRET_REGISTRY_USERNAME
password:
from_secret: SECRET_REGISTRY_PASSWORD
when:
branch:
- master
- rebase
- name: deploy-container
image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dockerproxy-clientdrone:latest
environment:
IMAGENAME: hub.codefirst.iut.uca.fr/louis.laborie/sae_2a_api_ef:latest
CONTAINERNAME: verax-api
COMMAND: create
OVERWRITE: true
CODEFIRST_CLIENTDRONE_ENV_ASPNETCORE_HTTP_PORTS: 80
ADMINS: louislaborie,tonyfages
depends_on:
- docker-build-and-push

@ -1,2 +1,76 @@
# Verax_API_EF <h1 align="center">Verax API EF</h1>
<p align="center">
<img src="https://img.shields.io/badge/C%23-239120.svg?style=for-the-badge&logo=c-sharp&logoColor=white" alt="C#"/>
<img src="https://img.shields.io/badge/Entity%20Framework-512BD4.svg?style=for-the-badge&logo=entity-framework&logoColor=white" alt="Entity Framework"/>
<img src="https://img.shields.io/badge/.NET-512BD4.svg?style=for-the-badge&logo=.net&logoColor=white" alt=".NET"/>
<img src="https://img.shields.io/badge/SQL%20Server-E34F26.svg?style=for-the-badge&logo=microsoft-sql-server&logoColor=white" alt="SQL Server"/>
<img src="https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=Verax_API_EF&metric=alert_status&token=09154b15417d84a94e809d60f1d5bb01654b5501" alt="Coverage"/>
</p>
## Introduction
Bienvenue sur le projet `Verax_API_EF`, une API RESTful développée spécifiquement pour faciliter la communication entre le site web et l'application Android du projet [Verax](https://codefirst.iut.uca.fr/git/Verax/Verax). Cette interface est conçue pour gérer efficacement les articles, les formulaires, et les utilisateurs.
## Technologies
- **.NET 8**: Le framework utilisé pour développer l'application.
- **Entity Framework Core**: ORM utilisé pour l'accès et la gestion de la base de données.
- **SQL Server**: Système de gestion de base de données recommandé (modifiable selon vos préférences).
## Configuration requise
- .NET 8.
- Un IDE tel que Visual Studio, VS Code avec l'extension C#, ou JetBrains Rider pour le développement.
## Installation
1. **Cloner le projet** : Exécutez `git clone https://codefirst.iut.uca.fr/git/Verax/Verax_API_EF.git` pour cloner le dépôt dans votre espace de travail local.
2. Ouvrez le fichier `Verax_API_EF.sln` avec votre IDE.
3. Restaurez les packages nécessaires.
4. Lancez le projet depuis IDE.
## Utilisation
Après avoir lancé l'API, elle sera accessible via `http://localhost:5000` par défaut. Voici quelques exemples de requêtes que vous pouvez effectuer :
- **Obtenir des articles** : `GET /articles`
- **Ajouter un utilisateur** : `POST /user`
- **Mettre à jour un article** : `PUT /article/{id}`
- **Supprimer un formulaire** : `DELETE /formulaire/{id}`
## Problèmes pouvant être rencontrés
### Migration
- Lors de la création de la base de données, l'API s'appuie sur une migration incluse dans le projet `DbContextLib`. Si cette migration est absente, l'API ne fonctionnera pas correctement car la base de données sera vide, entraînant ainsi l'absence de données retournées. En cas de non présence de cette migration, vous devrez décommenter les lignes dans le fichier `LibraryContext.cs` du projet `DbContextLib` (aux alentours de la ligne 60), puis exécuter les commandes suivantes :
```bash
dotnet ef migrations add mrg1 --project DbContextLib --context LibraryContext
```
PS: N'oubliez pas de supprimer l'ancienne base de données dans le projet API et de recommenter les lignes dans le fichier `LibraryContext.cs`
### Tests Console API
- Pour exécuter les tests console de l'API, assurez-vous au préalable que l'API est en cours d'exécution sur votre machine. Il est également crucial de vérifier que le port utilisé par l'application correspond à celui spécifié dans les configurations des tests. Cette vérification garantit que les tests peuvent interagir correctement avec l'API et fournir des résultats fiables.
## Equipe de développement
<p align="center" >
<a href="https://codefirst.iut.uca.fr/git/louis.laborie" style="margin-right: 20px;">
<img src="img/Louis.png" width="50" height="50" title="Louis Laborie" alt="Louis Laborie"/>
</a>
<a href="https://codefirst.iut.uca.fr/git/tony.fages" style="margin-right: 20px;">
<img src="img/Tony.png" width="50" height="50" title="Tony Fages" alt="Tony Fages"/>
</a>
<p>

@ -1,507 +0,0 @@
# ---> macOS
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# ---> VisualStudio
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml
# ---> JetBrains
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser

@ -0,0 +1,85 @@
Private property of Exodus: 16477@macbook-pro-de-fages.home
jetbrains.exodus.io.LockingManager.lock(LockingManager.kt:88)
jetbrains.exodus.io.LockingManager.lock(LockingManager.kt:39)
jetbrains.exodus.io.FileDataWriter.lock(FileDataWriter.kt:70)
jetbrains.exodus.log.Log.tryLock(Log.kt:804)
jetbrains.exodus.log.Log.<init>(Log.kt:117)
jetbrains.exodus.env.Environments.newLogInstance(Environments.kt:117)
jetbrains.exodus.env.Environments.newLogInstance(Environments.kt:81)
jetbrains.exodus.env.Environments.newLogInstance(Environments.kt:77)
jetbrains.exodus.env.Environments$newInstance$4.invoke(Environments.kt:46)
jetbrains.exodus.env.Environments$newInstance$4.invoke(Environments.kt:46)
jetbrains.exodus.env.Environments.prepare(Environments.kt:120)
jetbrains.exodus.env.Environments.newInstance(Environments.kt:46)
kotlinx.dnq.store.container.EntityStoreHelperKt.createTransientEntityStore(EntityStoreHelper.kt:40)
kotlinx.dnq.store.container.EntityStoreHelperKt.createTransientEntityStore(EntityStoreHelper.kt:31)
kotlinx.dnq.store.container.EntityStoreHelperKt.createTransientEntityStore$default(EntityStoreHelper.kt:30)
com.github.copilot.chat.session.persistence.xodus.XdChatSessionPersistenceService.initStore(XdChatSessionPersistenceService.kt:115)
com.github.copilot.chat.session.persistence.xodus.XdChatSessionPersistenceService.<init>(XdChatSessionPersistenceService.kt:22)
com.github.copilot.chat.session.persistence.xodus.XdChatSessionPersistenceService.<init>(XdChatSessionPersistenceService.kt:15)
com.github.copilot.chat.session.persistence.ChatSessionPersistenceServiceKt.ChatSessionPersistenceService(ChatSessionPersistenceService.kt:43)
com.github.copilot.chat.session.persistence.ChatSessionPersistenceServiceKt.chatSessionsPersistenceService(ChatSessionPersistenceService.kt:53)
com.github.copilot.chat.session.ChatSessionManager.<init>(ChatSessionManager.kt:45)
com.github.copilot.chat.session.ChatSessionManager.<init>(ChatSessionManager.kt:25)
com.github.copilot.chat.window.CopilotChatToolWindow.onCopilotReady(CopilotChatToolWindow.kt:133)
com.github.copilot.chat.window.CopilotChatToolWindow.access$onCopilotReady(CopilotChatToolWindow.kt:40)
com.github.copilot.chat.window.CopilotChatToolWindow$initCopilotStatusListener$1.invoke(CopilotChatToolWindow.kt:118)
com.github.copilot.chat.window.CopilotChatToolWindow$initCopilotStatusListener$1.invoke(CopilotChatToolWindow.kt:115)
com.github.copilot.status.CopilotAuthStatusKt.subscribeToCopilotAuthStatus(CopilotAuthStatus.kt:27)
com.github.copilot.chat.window.CopilotChatToolWindow.initCopilotStatusListener(CopilotChatToolWindow.kt:115)
com.github.copilot.chat.window.CopilotChatToolWindow.<init>(CopilotChatToolWindow.kt:59)
com.github.copilot.chat.window.CopilotChatToolWindow.<init>(CopilotChatToolWindow.kt:40)
com.github.copilot.chat.window.CopilotChatToolWindowFactory.init(CopilotChatToolWindowFactory.kt:18)
com.intellij.openapi.wm.impl.ToolWindowManagerImpl.registerToolWindow$intellij_platform_ide_impl(ToolWindowManagerImpl.kt:1123)
com.intellij.toolWindow.ToolWindowSetInitializerKt.registerToolWindows(ToolWindowSetInitializer.kt:223)
com.intellij.toolWindow.ToolWindowSetInitializerKt.access$registerToolWindows(ToolWindowSetInitializer.kt:1)
com.intellij.toolWindow.ToolWindowSetInitializer$createAndLayoutToolWindows$entries$1$1.invokeSuspend(ToolWindowSetInitializer.kt:141)
com.intellij.toolWindow.ToolWindowSetInitializer$createAndLayoutToolWindows$entries$1$1.invoke(ToolWindowSetInitializer.kt)
com.intellij.toolWindow.ToolWindowSetInitializer$createAndLayoutToolWindows$entries$1$1.invoke(ToolWindowSetInitializer.kt)
kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78)
kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:167)
kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
com.intellij.platform.diagnostic.telemetry.impl.TracerKt.span(tracer.kt:53)
com.intellij.platform.diagnostic.telemetry.impl.TracerKt.span$default(tracer.kt:49)
com.intellij.toolWindow.ToolWindowSetInitializer$createAndLayoutToolWindows$entries$1.invokeSuspend(ToolWindowSetInitializer.kt:138)
kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
com.intellij.openapi.application.TransactionGuardImpl$1.run(TransactionGuardImpl.java:194)
com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:843)
com.intellij.openapi.application.impl.ApplicationImpl$4.run(ApplicationImpl.java:463)
com.intellij.openapi.application.impl.RwLockHolder.runWithEnabledImplicitRead(RwLockHolder.kt:75)
com.intellij.openapi.application.impl.RwLockHolder.runWithImplicitRead(RwLockHolder.kt:67)
com.intellij.openapi.application.impl.ApplicationImpl.runWithImplicitRead(ApplicationImpl.java:1436)
com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:82)
com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:124)
com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:44)
java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:792)
java.desktop/java.awt.EventQueue$3.run(EventQueue.java:739)
java.desktop/java.awt.EventQueue$3.run(EventQueue.java:733)
java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:761)
com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:695)
com.intellij.ide.IdeEventQueue._dispatchEvent$lambda$12(IdeEventQueue.kt:589)
com.intellij.openapi.application.impl.RwLockHolder.runWithoutImplicitRead(RwLockHolder.kt:44)
com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:589)
com.intellij.ide.IdeEventQueue.access$_dispatchEvent(IdeEventQueue.kt:72)
com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:355)
com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:354)
com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:793)
com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:354)
com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:349)
com.intellij.ide.IdeEventQueueKt.performActivity$lambda$1(IdeEventQueue.kt:1014)
com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:106)
com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:1014)
com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$7(IdeEventQueue.kt:349)
com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:848)
com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:391)
java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RiderProjectSettingsUpdater">
<option name="vcsConfiguration" value="2" />
</component>
</project>

@ -2,6 +2,5 @@
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" /> <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component> </component>
</project> </project>

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoGeneratedRunConfigurationManager">
<projectFile profileName="http">API/API.csproj</projectFile>
<projectFile profileName="https">API/API.csproj</projectFile>
<projectFile>API_Tests_Console/API_Tests_Console.csproj</projectFile>
<projectFile>Test_Console_EF/Test_Console_EF.csproj</projectFile>
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="454eaf08-7244-4002-811f-5409ccfe6a2a" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/.idea/.idea.Verax_API_EF/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/.idea.Verax_API_EF/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/API/log.txt" beforeDir="false" afterPath="$PROJECT_DIR$/API/log.txt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/API_Tests_Console/Tests_Console_Connect_API.cs" beforeDir="false" afterPath="$PROJECT_DIR$/API_Tests_Console/Tests_Console_Connect_API.cs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/API_Tests_Console/Tests_Console_Connect_Localhost.cs" beforeDir="false" afterPath="$PROJECT_DIR$/API_Tests_Console/Tests_Console_Connect_Localhost.cs" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
</component>
<component name="MetaFilesCheckinStateConfiguration" checkMetaFiles="true" />
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 0
}</component>
<component name="ProjectId" id="2eXuZ2IMoPdjqkvkhUH8MxoFt4X" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
".NET Launch Settings Profile.API: http.executor": "Run",
".NET Project.API_Tests_Console.executor": "Run",
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"git-widget-placeholder": "master",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"vue.rearranger.settings.migration": "true"
},
"keyToStringList": {
"rider.external.source.directories": [
"/Users/tonyfages/Library/Application Support/JetBrains/Rider2023.3/resharper-host/DecompilerCache",
"/Users/tonyfages/Library/Application Support/JetBrains/Rider2023.3/resharper-host/SourcesCache",
"/Users/tonyfages/.local/share/Symbols/src"
]
}
}]]></component>
<component name="RunManager" selected=".NET Project.API_Tests_Console">
<configuration name="API_Tests_Console" type="DotNetProject" factoryName=".NET Project">
<option name="EXE_PATH" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="PROJECT_PATH" value="$PROJECT_DIR$/API_Tests_Console/API_Tests_Console.csproj" />
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
<option name="PROJECT_KIND" value="DotNetCore" />
<option name="PROJECT_TFM" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="Test_Console_EF" type="DotNetProject" factoryName=".NET Project">
<option name="EXE_PATH" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="PROJECT_PATH" value="$PROJECT_DIR$/Test_Console_EF/Test_Console_EF.csproj" />
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
<option name="PROJECT_KIND" value="DotNetCore" />
<option name="PROJECT_TFM" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="API: http" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/API/API.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="http" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="API: https" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/API/API.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="https" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="454eaf08-7244-4002-811f-5409ccfe6a2a" name="Changes" comment="" />
<created>1712063297753</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1712063297753</updated>
<workItem from="1712063301685" duration="548000" />
<workItem from="1712498505089" duration="6987000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="UnityCheckinConfiguration" checkUnsavedScenes="true" />
</project>

@ -6,6 +6,7 @@
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<InvariantGlobalization>true</InvariantGlobalization> <InvariantGlobalization>true</InvariantGlobalization>
<StartWorkingDirectory>$(MSBuildProjectDirectory)</StartWorkingDirectory> <StartWorkingDirectory>$(MSBuildProjectDirectory)</StartWorkingDirectory>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -32,4 +33,10 @@
<ProjectReference Include="..\StubbedContextLib\StubbedContextLib.csproj" /> <ProjectReference Include="..\StubbedContextLib\StubbedContextLib.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Include="..\.dockerignore">
<Link>.dockerignore</Link>
</Content>
</ItemGroup>
</Project> </Project>

@ -1,11 +1,13 @@
using API_Mapping; using API_Mapping;
using API_Services; using API_Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Model; using Model;
namespace API.Controllers namespace API.Controllers
{ {
[Authorize]
[Route("api/[controller]")] [Route("api/[controller]")]
[ApiController] [ApiController]
public class ArticleController : ControllerBase public class ArticleController : ControllerBase

@ -5,9 +5,11 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using API_Mapping; using API_Mapping;
using Microsoft.AspNetCore.Authorization;
namespace API.Controllers namespace API.Controllers
{ {
[Authorize]
[Route("api/[controller]")] [Route("api/[controller]")]
[ApiController] [ApiController]
public class FormulaireController : ControllerBase public class FormulaireController : ControllerBase

@ -4,10 +4,12 @@ using API_Services;
using Model; using Model;
using API_Mapping; using API_Mapping;
using Entities; using Entities;
using Microsoft.AspNetCore.Authorization;
namespace API.Controllers namespace API.Controllers
{ {
[Authorize]
[Route("api/[controller]")] [Route("api/[controller]")]
[ApiController] [ApiController]
public class UserController : ControllerBase public class UserController : ControllerBase
@ -125,7 +127,7 @@ namespace API.Controllers
} }
} }
[HttpGet("/articleUsers")] [HttpGet("/user/article/users")]
public async Task<IActionResult> GetAllArticleUsers() public async Task<IActionResult> GetAllArticleUsers()
{ {
_logger.LogInformation("Executing {Action} - with parameters: {Parameters}",nameof(GetAllArticleUsers), ""); _logger.LogInformation("Executing {Action} - with parameters: {Parameters}",nameof(GetAllArticleUsers), "");
@ -145,7 +147,7 @@ namespace API.Controllers
} }
} }
[HttpGet("/user/{pseudo}/article")] [HttpGet("/user/{pseudo}/articles")]
public async Task<IActionResult> GetArticleUser(string pseudo) public async Task<IActionResult> GetArticleUser(string pseudo)
{ {
_logger.LogInformation("Executing {Action} - with parameters: {Parameters}",nameof(GetArticleUser), pseudo); _logger.LogInformation("Executing {Action} - with parameters: {Parameters}",nameof(GetArticleUser), pseudo);
@ -206,18 +208,34 @@ namespace API.Controllers
} }
} }
[HttpPut("/user/{pseudo}/article")] [HttpPut("/user/{pseudo}/{oldId}")]
public async Task<IActionResult> UpdateArticleUser(ArticleUserEntity articleUser) public async Task<IActionResult> UpdateArticleUser(ArticleUserEntity articleUser, long oldId)
{ {
_logger.LogInformation("Executing {Action} - with parameters: {Parameters}",nameof(UpdateArticleUser), articleUser); _logger.LogInformation("Executing {Action} - with parameters: {Parameters}",nameof(UpdateArticleUser), articleUser);
try try
{ {
var result = (await _dataManager.UserService.UpdateArticleUser(articleUser)); var existingEntity = (await _dataManager.UserService.GetArticleUser(articleUser.UserEntityPseudo)).Select(a => a.ToDTO());
if (!result)
if (existingEntity == null)
{ {
return BadRequest($"ArticleUser {articleUser.UserEntityPseudo} does not exist"); return NotFound($"ArticleUser {articleUser.UserEntityPseudo} does not exist");
} }
return Ok(result);
var deleteResult = await _dataManager.UserService.DeleteArticleUser(articleUser.UserEntityPseudo, oldId);
if (!deleteResult)
{
return BadRequest($"Failed to delete ArticleUser {articleUser.UserEntityPseudo}");
}
var createResult = await _dataManager.UserService.CreateArticleUser(articleUser);
if (createResult == null)
{
return BadRequest($"Failed to create ArticleUser {articleUser.UserEntityPseudo}");
}
return Ok(createResult);
} }
catch (Exception error) catch (Exception error)
{ {
@ -225,7 +243,5 @@ namespace API.Controllers
return BadRequest(error.Message); return BadRequest(error.Message);
} }
} }
} }
} }

@ -75,13 +75,18 @@ app.MapIdentityApi<IdentityUser>();
app.MapSwagger().RequireAuthorization(); app.MapSwagger().RequireAuthorization();
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
/*
if (app.Environment.IsDevelopment()) if (app.Environment.IsDevelopment())
{ {
app.UseSwagger(); app.UseSwagger();
app.UseSwaggerUI(); app.UseSwaggerUI();
} }*/
app.UseSwagger();
app.UseSwaggerUI();
app.UseHttpsRedirection(); app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

File diff suppressed because it is too large Load Diff

@ -0,0 +1,559 @@
using System.Net.Http.Headers;
namespace API_Tests_Console;
using System.Text;
using System.Text.Json;
using Entities;
using Model;
public class Tests_Console_Connect_API
{
// Cette section permet de tester d'API déployée sur le serveur codefirst de l'IUT
static readonly HttpClient client = new HttpClient();
static string email = "verax@verax.com";
static string password = "P@ssw0rd1";
public static async Task Main2(string[] args)
{
//await RegisterUser("verax@verax.com", "P@ssw0rd1");
// Ne pas commenter cette ligne
string tokenAPI = await LoginAndGetToken(email, password);
//await TestUser(tokenAPI);
//await TestFormulaire(tokenAPI);
await TestArticle(tokenAPI);
}
private static async Task TestFormulaire(string tokenAPI)
{
await TestFormulaireGetAll(tokenAPI);
await TestFormulaireGetId(tokenAPI);
//await TestFormulaireCreate(tokenAPI);
//await TestFormulaireDelete(tokenAPI);
//await TestFormulaireUpdate(tokenAPI);
}
private static async Task TestUser(string tokenAPI)
{
await TestUserGetAll(tokenAPI);
await TestUserGetId(tokenAPI);
await TestUserCreate(tokenAPI);
//await TestUserDelete(tokenAPI);
//await TestUserUpdate(tokenAPI);
await TestGetAllArticleUser(tokenAPI);
await TestGetArticleByUser(tokenAPI);
//await TestCreateArticleUser(tokenAPI);
//await TestDeleteArticleUser(tokenAPI);
//await TestUpdateArticleUser(tokenAPI);
}
static async Task TestArticle(string tokenAPI)
{
await TestArticleGetId(tokenAPI);
//await TestArticleCreate(tokenAPI);
await TestArticleGetAll(tokenAPI);
//await TestArticleDelete(tokenAPI);
//await TestArticleUpdate(tokenAPI);
}
public static async Task<string> LoginAndGetToken(string Email, string Password)
{
var credentials = new
{
email = Email,
password = Password
};
var json = JsonSerializer.Serialize(credentials);
var data = new StringContent(json, Encoding.UTF8, "application/json");
try
{
var response = await client.PostAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/login", data);
var responseBody = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
using (JsonDocument doc = JsonDocument.Parse(responseBody))
{
if (doc.RootElement.TryGetProperty("accessToken", out JsonElement tokenElement)) // Change "token" to the actual property name
{
string token = tokenElement.GetString();
Console.WriteLine("Token retrieved");
return token;
}
else
{
Console.WriteLine("Token not found in the response.");
return null;
}
}
}
else
{
Console.WriteLine($"Login failed: {response.StatusCode}");
Console.WriteLine(responseBody);
return null;
}
}
catch (HttpRequestException e)
{
Console.WriteLine($"HttpRequestException: {e.Message}");
return null;
}
catch (JsonException e)
{
Console.WriteLine($"Error parsing JSON response: {e.Message}");
return null;
}
}
public static async Task<string> RegisterUser(string email, string password)
{
var newUser = new
{
email = email,
password = password
};
var json = JsonSerializer.Serialize(newUser);
var data = new StringContent(json, Encoding.UTF8, "application/json");
try
{
var response = await client.PostAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/register", data);
var responseBody = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Registration successful");
Console.WriteLine(responseBody);
return responseBody;
}
else
{
Console.WriteLine($"Registration failed: {response.StatusCode}");
Console.WriteLine(responseBody);
return null;
}
}
catch (HttpRequestException e)
{
Console.WriteLine($"HttpRequestException: {e.Message}");
return null;
}
catch (Exception e)
{
Console.WriteLine($"General Exception: {e.Message}");
return null;
}
}
static async Task TestArticleGetAll(string tokenAPI)
{
try
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/articles");
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestArticleGetId(string tokenAPI)
{
try
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/article/1");
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestArticleCreate(string tokenAPI)
{
try
{
var article = new Article()
{
Title = "Test",
Description = "Test",
Author = "Test",
DatePublished = "Test",
LectureTime = 0
};
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(article);
var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/article", data);
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestArticleDelete(string tokenAPI)
{
try
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.DeleteAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/article/1");
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestArticleUpdate(string tokenAPI)
{
try
{
var article = new Article()
{
Title = "Louis",
Description = "Je",
Author = "T'",
DatePublished = "aime",
LectureTime = 0
};
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(article);
var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PutAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/article/1", data);
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestFormulaireGetAll(string tokenAPI)
{
try
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/formulaires");
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestFormulaireGetId(string tokenAPI)
{
try
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/formulaire/1");
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestFormulaireCreate(string tokenAPI)
{
try
{
var formulaire = new Formulaire()
{
Theme = "Test",
Date = "Test",
Lien = "Test",
UserPseudo = "Sha"
};
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(formulaire);
var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/formulaire", data);
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestFormulaireDelete(string tokenAPI)
{
try
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.DeleteAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/formulaire/5");
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestFormulaireUpdate(string tokenAPI)
{
try
{
var formulaire = new Formulaire()
{
Theme = "J'",
Date = "aime",
Lien = "Les",
UserPseudo = "Sha"
};
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(formulaire);
var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PutAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/", data);
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestUserGetAll(string tokenAPI)
{
try
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/users");
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestUserGetId(string tokenAPI)
{
try
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/user/Sha");
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestUserCreate(string tokenAPI)
{
try
{
var user = new User()
{
Pseudo = "J",
Nom = "'",
Prenom = "aime",
Mail = "les",
Mdp = "pieds",
Role = "Admin"
};
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(user);
var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/user", data);
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestUserDelete(string tokenAPI)
{
try
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.DeleteAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/user/Sha");
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestUserUpdate(string tokenAPI)
{
try
{
var user = new User()
{
Pseudo = "Sha",
Nom = "J'",
Prenom = "aime",
Mail = "les",
Mdp = "pieds",
Role = "Admin"
};
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(user);
var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PutAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/user/Sha", data);
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestGetAllArticleUser(string tokenAPI)
{
try
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/article/users");
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestGetArticleByUser(string tokenAPI)
{
try
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/user/Sha/articles");
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestCreateArticleUser(string tokenAPI)
{
try
{
var articleUser = new ArticleUserEntity()
{
ArticleEntityId = 1,
UserEntityPseudo = "Sha"
};
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(articleUser);
var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/user/article", data);
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestDeleteArticleUser(string tokenAPI)
{
try
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.DeleteAsync("https://codefirst.iut.uca.fr/containers/Verax-verax-api/user/Sha/3");
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static async Task TestUpdateArticleUser(string tokenAPI)
{
try
{
var articleUser = new ArticleUserEntity()
{
ArticleEntityId = 2,
UserEntityPseudo = "Sha"
};
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
long oldId = 3;
var json = JsonSerializer.Serialize(articleUser);
var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PutAsync($"https://codefirst.iut.uca.fr/containers/Verax-verax-api/user/Sha/{oldId}", data);
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}

@ -1,60 +1,76 @@
// See https://aka.ms/new-console-template for more information // See https://aka.ms/new-console-template for more information
using System.Net.Http.Headers;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using API_Tests_Console;
using Entities; using Entities;
using Model; using Model;
class Tests_Console class Tests_Console_Connect_Localhost
{ {
static readonly HttpClient client = new HttpClient();
static readonly HttpClient client = new HttpClient();
static string email = "verax@verax.com";
static string password = "P@ssw0rd1";
static async Task Main(string[] args) static async Task Main(string[] args)
{ {
//await TestUser(); //Commenter lignes apres premier execution
await TestFormulaire(); await RegisterUser(email, password);
//await TestArticle();
string tokenAPI = await LoginAndGetToken(email, password);
await TestUser(tokenAPI);
await TestFormulaire(tokenAPI);
await TestArticle(tokenAPI);
//Pour executer les tests de la console en communiquant avec l'API deployée sur codeFirst
//await Tests_Console_Connect_API.Main2(args);
} }
private static async Task TestFormulaire() private static async Task TestFormulaire(string tokenAPI)
{ {
await TestFormulaireGetAll(); await TestFormulaireGetAll(tokenAPI);
//await TestFormulaireGetId(); await TestFormulaireGetId(tokenAPI);
//await TestFormulaireCreate(); //await TestFormulaireCreate(tokenAPI);
//await TestFormulaireDelete(); //await TestFormulaireDelete(tokenAPI);
//await TestFormulaireUpdate(); //await TestFormulaireUpdate(tokenAPI);
} }
private static async Task TestUser() private static async Task TestUser(string tokenAPI)
{ {
//await TestUserGetAll(); await TestUserGetAll(tokenAPI);
//await TestUserGetId(); await TestUserGetId(tokenAPI);
//await TestUserCreate(); //await TestUserCreate(tokenAPI);
//await TestUserDelete(); //await TestUserDelete(tokenAPI);
//await TestUserUpdate(); //await TestUserUpdate(tokenAPI);
//await TestGetAllArticleUser(); await TestGetAllArticleUser(tokenAPI);
//await TestGetArticleByUser(); await TestGetArticleByUser(tokenAPI);
//await TestCreateArticleUser(); //await TestCreateArticleUser(tokenAPI);
//await TestDeleteArticleUser(); //await TestDeleteArticleUser(tokenAPI);
//await TestUpdateArticleUser(); //await TestUpdateArticleUser(tokenAPI);
} }
static async Task TestArticle() static async Task TestArticle(string tokenAPI)
{ {
await TestArticleGetId(); await TestArticleGetId(tokenAPI);
await TestArticleCreate(); //await TestArticleCreate(tokenAPI);
await TestArticleGetAll(); await TestArticleGetAll(tokenAPI);
await TestArticleDelete(); //await TestArticleDelete(tokenAPI);
await TestArticleUpdate(); //await TestArticleUpdate(tokenAPI);
} }
static async Task TestArticleGetAll() static async Task TestArticleGetAll(string tokenAPI)
{ {
try try
{ {
var response = await client.GetAsync("http://localhost:5052/api/Article"); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("http://localhost:5052/articles");
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync(); var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody); Console.WriteLine(responseBody);
@ -65,10 +81,11 @@ class Tests_Console
} }
} }
static async Task TestArticleGetId() static async Task TestArticleGetId(string tokenAPI)
{ {
try try
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("http://localhost:5052/article/1"); var response = await client.GetAsync("http://localhost:5052/article/1");
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync(); var responseBody = await response.Content.ReadAsStringAsync();
@ -80,7 +97,7 @@ class Tests_Console
} }
} }
static async Task TestArticleCreate() static async Task TestArticleCreate(string tokenAPI)
{ {
try try
{ {
@ -92,6 +109,7 @@ class Tests_Console
DatePublished = "Test", DatePublished = "Test",
LectureTime = 0 LectureTime = 0
}; };
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(article); var json = JsonSerializer.Serialize(article);
var data = new StringContent(json, Encoding.UTF8, "application/json"); var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("http://localhost:5052/article", data); var response = await client.PostAsync("http://localhost:5052/article", data);
@ -105,11 +123,12 @@ class Tests_Console
} }
} }
static async Task TestArticleDelete() static async Task TestArticleDelete(string tokenAPI)
{ {
try try
{ {
var response = await client.DeleteAsync("http://localhost:5052/article/4"); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.DeleteAsync("http://localhost:5052/article/1");
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync(); var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody); Console.WriteLine(responseBody);
@ -120,7 +139,7 @@ class Tests_Console
} }
} }
static async Task TestArticleUpdate() static async Task TestArticleUpdate(string tokenAPI)
{ {
try try
{ {
@ -132,6 +151,7 @@ class Tests_Console
DatePublished = "aime", DatePublished = "aime",
LectureTime = 0 LectureTime = 0
}; };
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(article); var json = JsonSerializer.Serialize(article);
var data = new StringContent(json, Encoding.UTF8, "application/json"); var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PutAsync("http://localhost:5052/article/1", data); var response = await client.PutAsync("http://localhost:5052/article/1", data);
@ -145,10 +165,11 @@ class Tests_Console
} }
} }
static async Task TestFormulaireGetAll() static async Task TestFormulaireGetAll(string tokenAPI)
{ {
try try
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("http://localhost:5052/formulaires"); var response = await client.GetAsync("http://localhost:5052/formulaires");
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync(); var responseBody = await response.Content.ReadAsStringAsync();
@ -160,10 +181,11 @@ class Tests_Console
} }
} }
static async Task TestFormulaireGetId() static async Task TestFormulaireGetId(string tokenAPI)
{ {
try try
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("http://localhost:5052/formulaire/2"); var response = await client.GetAsync("http://localhost:5052/formulaire/2");
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync(); var responseBody = await response.Content.ReadAsStringAsync();
@ -175,7 +197,7 @@ class Tests_Console
} }
} }
static async Task TestFormulaireCreate() static async Task TestFormulaireCreate(string tokenAPI)
{ {
try try
{ {
@ -186,6 +208,7 @@ class Tests_Console
Lien = "Test", Lien = "Test",
UserPseudo = "Sha" UserPseudo = "Sha"
}; };
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(formulaire); var json = JsonSerializer.Serialize(formulaire);
var data = new StringContent(json, Encoding.UTF8, "application/json"); var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("http://localhost:5052/formulaire", data); var response = await client.PostAsync("http://localhost:5052/formulaire", data);
@ -199,10 +222,11 @@ class Tests_Console
} }
} }
static async Task TestFormulaireDelete() static async Task TestFormulaireDelete(string tokenAPI)
{ {
try try
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.DeleteAsync("http://localhost:5052/formulaire/5"); var response = await client.DeleteAsync("http://localhost:5052/formulaire/5");
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync(); var responseBody = await response.Content.ReadAsStringAsync();
@ -214,7 +238,7 @@ class Tests_Console
} }
} }
static async Task TestFormulaireUpdate() static async Task TestFormulaireUpdate(string tokenAPI)
{ {
try try
{ {
@ -225,6 +249,7 @@ class Tests_Console
Lien = "Les", Lien = "Les",
UserPseudo = "Sha" UserPseudo = "Sha"
}; };
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(formulaire); var json = JsonSerializer.Serialize(formulaire);
var data = new StringContent(json, Encoding.UTF8, "application/json"); var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PutAsync("http://localhost:5052/formulaire/4", data); var response = await client.PutAsync("http://localhost:5052/formulaire/4", data);
@ -238,10 +263,11 @@ class Tests_Console
} }
} }
static async Task TestUserGetAll() static async Task TestUserGetAll(string tokenAPI)
{ {
try try
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("http://localhost:5052/users"); var response = await client.GetAsync("http://localhost:5052/users");
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync(); var responseBody = await response.Content.ReadAsStringAsync();
@ -253,10 +279,11 @@ class Tests_Console
} }
} }
static async Task TestUserGetId() static async Task TestUserGetId(string tokenAPI)
{ {
try try
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("http://localhost:5052/user/Sha"); var response = await client.GetAsync("http://localhost:5052/user/Sha");
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync(); var responseBody = await response.Content.ReadAsStringAsync();
@ -268,7 +295,7 @@ class Tests_Console
} }
} }
static async Task TestUserCreate() static async Task TestUserCreate(string tokenAPI)
{ {
try try
{ {
@ -281,6 +308,7 @@ class Tests_Console
Mdp = "pieds", Mdp = "pieds",
Role = "Admin" Role = "Admin"
}; };
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(user); var json = JsonSerializer.Serialize(user);
var data = new StringContent(json, Encoding.UTF8, "application/json"); var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("http://localhost:5052/user", data); var response = await client.PostAsync("http://localhost:5052/user", data);
@ -294,10 +322,11 @@ class Tests_Console
} }
} }
static async Task TestUserDelete() static async Task TestUserDelete(string tokenAPI)
{ {
try try
{ {
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.DeleteAsync("http://localhost:5052/user/J"); var response = await client.DeleteAsync("http://localhost:5052/user/J");
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync(); var responseBody = await response.Content.ReadAsStringAsync();
@ -309,7 +338,7 @@ class Tests_Console
} }
} }
static async Task TestUserUpdate() static async Task TestUserUpdate(string tokenAPI)
{ {
try try
{ {
@ -322,6 +351,7 @@ class Tests_Console
Mdp = "pieds", Mdp = "pieds",
Role = "Admin" Role = "Admin"
}; };
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(user); var json = JsonSerializer.Serialize(user);
var data = new StringContent(json, Encoding.UTF8, "application/json"); var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PutAsync("http://localhost:5052/user/Sha", data); var response = await client.PutAsync("http://localhost:5052/user/Sha", data);
@ -335,11 +365,12 @@ class Tests_Console
} }
} }
static async Task TestGetAllArticleUser() static async Task TestGetAllArticleUser(string tokenAPI)
{ {
try try
{ {
var response = await client.GetAsync("http://localhost:5052/ArticleUsers"); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("http://localhost:5052/user/article/users");
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync(); var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody); Console.WriteLine(responseBody);
@ -350,11 +381,12 @@ class Tests_Console
} }
} }
static async Task TestGetArticleByUser() static async Task TestGetArticleByUser(string tokenAPI)
{ {
try try
{ {
var response = await client.GetAsync("http://localhost:5052/user/Sha/article"); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.GetAsync("http://localhost:5052/user/Sha/articles");
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync(); var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody); Console.WriteLine(responseBody);
@ -365,7 +397,7 @@ class Tests_Console
} }
} }
static async Task TestCreateArticleUser() static async Task TestCreateArticleUser(string tokenAPI)
{ {
try try
{ {
@ -374,6 +406,7 @@ class Tests_Console
ArticleEntityId = 1, ArticleEntityId = 1,
UserEntityPseudo = "Sha" UserEntityPseudo = "Sha"
}; };
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var json = JsonSerializer.Serialize(articleUser); var json = JsonSerializer.Serialize(articleUser);
var data = new StringContent(json, Encoding.UTF8, "application/json"); var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("http://localhost:5052/user/article", data); var response = await client.PostAsync("http://localhost:5052/user/article", data);
@ -387,11 +420,12 @@ class Tests_Console
} }
} }
static async Task TestDeleteArticleUser() static async Task TestDeleteArticleUser(string tokenAPI)
{ {
try try
{ {
var response = await client.DeleteAsync("http://localhost:5052/user/Sha/article"); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
var response = await client.DeleteAsync("http://localhost:5052/user/Sha/3");
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync(); var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody); Console.WriteLine(responseBody);
@ -402,18 +436,20 @@ class Tests_Console
} }
} }
static async Task TestUpdateArticleUser() static async Task TestUpdateArticleUser(string tokenAPI)
{ {
try try
{ {
var articleUser = new ArticleUserEntity() var articleUser = new ArticleUserEntity()
{ {
ArticleEntityId = 1, ArticleEntityId = 2,
UserEntityPseudo = "Sha" UserEntityPseudo = "Sha"
}; };
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenAPI);
long oldId = 3;
var json = JsonSerializer.Serialize(articleUser); var json = JsonSerializer.Serialize(articleUser);
var data = new StringContent(json, Encoding.UTF8, "application/json"); var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PutAsync("http://localhost:5052/user/Sha/article", data); var response = await client.PutAsync($"http://localhost:5052/user/Sha/{oldId}", data);
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync(); var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody); Console.WriteLine(responseBody);
@ -424,4 +460,99 @@ class Tests_Console
} }
} }
public static async Task<string> LoginAndGetToken(string Email, string Password)
{
var credentials = new
{
email = Email,
password = Password
};
var json = JsonSerializer.Serialize(credentials);
var data = new StringContent(json, Encoding.UTF8, "application/json");
try
{
var response = await client.PostAsync("http://localhost:5052/login", data);
var responseBody = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
using (JsonDocument doc = JsonDocument.Parse(responseBody))
{
if (doc.RootElement.TryGetProperty("accessToken", out JsonElement tokenElement)) // Change "token" to the actual property name
{
string token = tokenElement.GetString();
Console.WriteLine("Token retrieved");
return token;
}
else
{
Console.WriteLine("Token not found in the response.");
return null;
}
}
}
else
{
Console.WriteLine($"Login failed: {response.StatusCode}");
Console.WriteLine(responseBody);
return null;
}
}
catch (HttpRequestException e)
{
Console.WriteLine($"HttpRequestException: {e.Message}");
return null;
}
catch (JsonException e)
{
Console.WriteLine($"Error parsing JSON response: {e.Message}");
return null;
}
}
public static async Task<string> RegisterUser(string email, string password)
{
var newUser = new
{
email = email,
password = password
};
var json = JsonSerializer.Serialize(newUser);
var data = new StringContent(json, Encoding.UTF8, "application/json");
try
{
var response = await client.PostAsync("http://localhost:5052/register", data);
var responseBody = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Registration successful");
Console.WriteLine(responseBody);
return responseBody;
}
else
{
Console.WriteLine($"Registration failed: {response.StatusCode}");
Console.WriteLine(responseBody);
return null;
}
}
catch (HttpRequestException e)
{
Console.WriteLine($"HttpRequestException: {e.Message}");
return null;
}
catch (Exception e)
{
Console.WriteLine($"General Exception: {e.Message}");
return null;
}
}
} }

@ -0,0 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0"/>
<PackageReference Include="xunit" Version="2.4.2"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="6.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\API_Mapping\API_Mapping.csproj" />
</ItemGroup>
</Project>

@ -24,7 +24,11 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\API\API.csproj" />
<ProjectReference Include="..\API_DbDataManager\API_DbDataManager.csproj" />
<ProjectReference Include="..\API_Mapping\API_Mapping.csproj" />
<ProjectReference Include="..\API_Services\API_Services.csproj" /> <ProjectReference Include="..\API_Services\API_Services.csproj" />
<ProjectReference Include="..\DbContextLib\DbContextLib.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -0,0 +1,111 @@
using API.Controllers;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Model;
using Moq;
namespace API_Unit_Test;
public class ArticleControllerTests
{
private readonly Mock<IDataManager> _mockDataManager;
private readonly Mock<ILogger<ArticleController>> _mockLogger;
private readonly ArticleController _controller;
public ArticleControllerTests()
{
_mockDataManager = new Mock<IDataManager>();
_mockLogger = new Mock<ILogger<ArticleController>>();
_controller = new ArticleController(_mockDataManager.Object, _mockLogger.Object);
}
[Fact]
public async Task GetAllArticles_ReturnsOk()
{
// Arrange
_mockDataManager.Setup(dm => dm.ArticleService.GetAllArticles(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<ArticleOrderCriteria>()))
.ReturnsAsync(new List<Article>());
// Act
var result = await _controller.GetAllArticles();
// Assert
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task GetArticleById_ReturnsOk()
{
// Arrange
var testArticleId = 1;
_mockDataManager.Setup(dm => dm.ArticleService.GetArticleById(testArticleId))
.ReturnsAsync(new Article { Id = testArticleId });
// Act
var result = await _controller.GetArticleById(testArticleId);
// Assert
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task CreateArticle_ReturnsOk()
{
// Arrange
var article = new Article { Title = "Test" };
_mockDataManager.Setup(dm => dm.ArticleService.CreateArticle(article))
.ReturnsAsync(article);
// Act
var result = await _controller.CreateArticle(article);
// Assert
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task DeleteArticle_ReturnsOk()
{
// Arrange
var testArticleId = 1;
_mockDataManager.Setup(dm => dm.ArticleService.DeleteArticle(testArticleId))
.ReturnsAsync(new Article { Id = testArticleId });
// Act
var result = await _controller.DeleteArticle(testArticleId);
// Assert
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task UpdateArticle_ReturnsOk()
{
// Arrange
var testArticleId = 1;
var article = new Article { Title = "Updated" };
_mockDataManager.Setup(dm => dm.ArticleService.UpdateArticle(testArticleId, article))
.ReturnsAsync(article);
// Act
var result = await _controller.UpdateArticle(testArticleId, article);
// Assert
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task GetAllArticles_ThrowsException_ReturnsBadRequest()
{
// Arrange
_mockDataManager.Setup(dm => dm.ArticleService.GetAllArticles(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<ArticleOrderCriteria>()))
.ThrowsAsync(new Exception("Test exception"));
// Act
var result = await _controller.GetAllArticles();
// Assert
Assert.IsType<BadRequestObjectResult>(result);
}
}

@ -0,0 +1,35 @@
using Web_API.Model;
namespace API_Unit_Test;
public class ArticleDTOTests
{
[Fact]
public void ArticleDTOPropertiesTest()
{
// Arrange
var articleDTO = new ArticleDTO();
var testId = 1L;
var testTitle = "Test Title";
var testDescription = "Test Description";
var testDatePublished = "2024-03-16";
var testLectureTime = 5;
var testAuthor = "Test Author";
// Act
articleDTO.Id = testId;
articleDTO.Title = testTitle;
articleDTO.Description = testDescription;
articleDTO.DatePublished = testDatePublished;
articleDTO.LectureTime = testLectureTime;
articleDTO.Author = testAuthor;
// Assert
Assert.Equal(testId, articleDTO.Id);
Assert.Equal(testTitle, articleDTO.Title);
Assert.Equal(testDescription, articleDTO.Description);
Assert.Equal(testDatePublished, articleDTO.DatePublished);
Assert.Equal(testLectureTime, articleDTO.LectureTime);
Assert.Equal(testAuthor, articleDTO.Author);
}
}

@ -0,0 +1,72 @@
using API_Mapping;
using Model;
using Web_API.Model;
namespace API_UnitTest_Mapper;
public class ArticleMapperTests
{
[Fact]
public void ToDTOMapsCorrectly()
{
var article = new Article
{
Id = 1,
Title = "Test Article",
Description = "Test Description",
DatePublished = "2021-01-01",
LectureTime = 5,
Author = "Test Author"
};
var dto = ArticleMapper.ToDTO(article);
Assert.NotNull(dto);
Assert.Equal(article.Id, dto.Id);
Assert.Equal(article.Title, dto.Title);
Assert.Equal(article.Description, dto.Description);
Assert.Equal(article.DatePublished, dto.DatePublished);
Assert.Equal(article.LectureTime, dto.LectureTime);
Assert.Equal(article.Author, dto.Author);
}
[Fact]
public void ToModelMapsCorrectly()
{
var dto = new ArticleDTO
{
Id = 2,
Title = "Another Test Article",
Description = "Another Test Description",
DatePublished = "2021-01-02",
LectureTime = 10,
Author = "Another Test Author"
};
var article = ArticleMapper.ToModel(dto);
Assert.NotNull(article);
Assert.Equal(dto.Id, article.Id);
Assert.Equal(dto.Title, article.Title);
Assert.Equal(dto.Description, article.Description);
Assert.Equal(dto.DatePublished, article.DatePublished);
Assert.Equal(dto.LectureTime, article.LectureTime);
Assert.Equal(dto.Author, article.Author);
}
[Fact]
public void ToDTONullArticleThrowsNullReferenceException()
{
Article article = null;
Assert.Throws<NullReferenceException>(() => ArticleMapper.ToDTO(article));
}
[Fact]
public void ToModelNullArticleDTOThrowsNullReferenceException()
{
ArticleDTO dto = null;
Assert.Throws<NullReferenceException>(() => ArticleMapper.ToModel(dto));
}
}

@ -0,0 +1,130 @@
using DbContextLib;
using DbDataManager;
using Entities;
using Microsoft.EntityFrameworkCore;
using Model;
namespace API_Unit_Test;
public class DbManagerArticleTests
{
private LibraryContext GetInMemoryDbContext()
{
var options = new DbContextOptionsBuilder<LibraryContext>()
.UseInMemoryDatabase(databaseName: "LibraryDbForArticleInMemory" + Guid.NewGuid()) // Ensure a unique name for each test run
.Options;
var context = new LibraryContext(options);
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
return context;
}
[Fact]
public async Task GetAllArticles_ReturnsArticlesWithSpecifiedOrder()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
context.ArticleSet.AddRange(
new ArticleEntity { Title = "C", LectureTime = 30, DatePublished = "2024-03-16" },
new ArticleEntity { Title = "A", LectureTime = 10, DatePublished = "2024-03-16"},
new ArticleEntity { Title = "B", LectureTime = 20, DatePublished = "2024-03-16" }
);
context.SaveChanges();
var service = new DbManagerArticle(context);
// Act & Assert - Test ordering by title
var articlesByTitle = await service.GetAllArticles(0, 10, ArticleOrderCriteria.ByTitle);
Assert.Equal("A", articlesByTitle.First().Title);
// Test ordering by lecture time
var articlesByLectureTime = await service.GetAllArticles(0, 10, ArticleOrderCriteria.ByLectureTime);
Assert.Equal(10, articlesByLectureTime.First().LectureTime);
}
}
[Fact]
public async Task GetArticleById_ReturnsCorrectArticle()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var expectedArticle = new ArticleEntity { Title = "Test Article", Id = 1 };
context.ArticleSet.Add(expectedArticle);
context.SaveChanges();
var service = new DbManagerArticle(context);
// Act
var article = await service.GetArticleById(1);
// Assert
Assert.NotNull(article);
Assert.Equal("Test Article", article.Title);
}
}
[Fact]
public async Task CreateArticle_AddsNewArticleSuccessfully()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var service = new DbManagerArticle(context);
var newArticle = new Article { Title = "New Article" };
// Act
var createdArticle = await service.CreateArticle(newArticle);
// Assert
Assert.NotNull(createdArticle);
Assert.Equal("New Article", createdArticle.Title);
Assert.Single(context.ArticleSet);
}
}
[Fact]
public async Task UpdateArticle_UpdatesExistingArticleSuccessfully()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var originalArticle = new ArticleEntity { Id = 2, Title = "Original Title" };
context.ArticleSet.Add(originalArticle);
context.SaveChanges();
var service = new DbManagerArticle(context);
var updatedArticle = new Article { Id = 2, Title = "Updated Title" };
// Act
var result = await service.UpdateArticle(2, updatedArticle);
// Assert
Assert.NotNull(result);
Assert.Equal("Updated Title", result.Title);
Assert.Equal(2, result.Id);
}
}
[Fact]
public async Task DeleteArticle_RemovesArticleSuccessfully()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var articleToDelete = new ArticleEntity { Id = 3, Title = "Delete Me" };
context.ArticleSet.Add(articleToDelete);
context.SaveChanges();
var service = new DbManagerArticle(context);
// Act
var deletedArticle = await service.DeleteArticle(3);
// Assert
Assert.NotNull(deletedArticle);
Assert.DoesNotContain(context.ArticleSet, a => a.Id == 3);
}
}
}

@ -0,0 +1,204 @@
using DbContextLib;
using DbDataManager;
using Entities;
using Microsoft.EntityFrameworkCore;
using Model;
namespace API_Unit_Test;
public class DbManagerFormulaireTests
{
private LibraryContext GetInMemoryDbContext()
{
var options = new DbContextOptionsBuilder<LibraryContext>()
.UseInMemoryDatabase(databaseName: "LibraryDbForFormulaireInMemory" + Guid.NewGuid()) // Unique name for each test execution
.Options;
var context = new LibraryContext(options);
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
return context;
}
[Fact]
public async Task GetAllForm_ReturnsForms_WithSpecifiedOrder()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
context.FormSet.AddRange(
new FormEntity { Theme = "C", DatePublication = "2021-01-01", Link = "http://c.com", UserEntityPseudo = "user1" },
new FormEntity { Theme = "A", DatePublication = "2021-01-01", Link = "http://a.com", UserEntityPseudo = "user2" },
new FormEntity { Theme = "B", DatePublication = "2021-01-01", Link = "http://b.com", UserEntityPseudo = "user3" }
);
context.SaveChanges();
var service = new DbManagerFormulaire(context);
// Act & Assert - Test ordering by theme
var formsByTheme = await service.GetAllForm(0, 10, FormOrderCriteria.ByTheme);
Assert.Equal("A", formsByTheme.First().Theme);
// Test ordering by link
var formsByLink = await service.GetAllForm(0, 10, FormOrderCriteria.ByLien);
Assert.Equal("http://a.com", formsByLink.First().Lien);
}
}
[Fact]
public async Task GetById_ReturnsCorrectForm()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var expectedForm = new FormEntity { Id = 1, Theme = "Test Form", Link = "http://test.com", UserEntityPseudo = "user1" };
context.FormSet.Add(expectedForm);
context.SaveChanges();
var service = new DbManagerFormulaire(context);
// Act
var form = await service.GetById(1);
// Assert
Assert.NotNull(form);
Assert.Equal("Test Form", form.Theme);
Assert.Equal("http://test.com", form.Lien);
}
}
[Fact]
public async Task CreateForm_AddsNewFormSuccessfully()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var service = new DbManagerFormulaire(context);
var newForm = new Formulaire { Theme = "New Form", Lien = "http://newform.com", UserPseudo = "user1", Date = "2021-01-01"};
// Act
var createdForm = await service.CreateForm(newForm);
// Assert
Assert.NotNull(createdForm);
Assert.Equal("New Form", createdForm.Theme);
Assert.Equal("http://newform.com", createdForm.Lien);
Assert.Single(context.FormSet);
}
}
[Fact]
public async Task UpdateForm_UpdatesExistingFormSuccessfully()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var originalForm = new FormEntity { Id = 2, Theme = "Original Theme", Link = "http://original.com",UserEntityPseudo = "user1", DatePublication = "2021-01-01" };
context.FormSet.Add(originalForm);
context.SaveChanges();
var service = new DbManagerFormulaire(context);
var updatedForm = new Formulaire { Id = 2, Theme = "Updated Theme", Lien = "http://updated.com" };
// Act
var result = await service.UpdateForm(2, updatedForm);
// Assert
Assert.NotNull(result);
Assert.Equal("Updated Theme", result.Theme);
Assert.Equal("http://updated.com", result.Lien);
}
}
[Fact]
public async Task DeleteForm_RemovesFormSuccessfully()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var formToDelete = new FormEntity { Id = 3, Theme = "Delete Me", Link = "http://delete.com", UserEntityPseudo = "user1" };
context.FormSet.Add(formToDelete);
context.SaveChanges();
var service = new DbManagerFormulaire(context);
// Act
var deletedForm = await service.DeleteForm(3);
// Assert
Assert.NotNull(deletedForm);
Assert.DoesNotContain(context.FormSet, f => f.Id == 3);
}
}
[Fact]
public async Task GetById_NonExistentId_ReturnsNull()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var service = new DbManagerFormulaire(context);
// Act
var form = await service.GetById(999); // Assuming this ID doesn't exist
// Assert
Assert.Null(form);
}
}
[Fact]
public async Task UpdateForm_NonExistentForm_ReturnsNull()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var service = new DbManagerFormulaire(context);
var nonExistentForm = new Formulaire { Id = 999, Theme = "Non-Existent Theme", UserPseudo = "user1" };
// Act
var result = await service.UpdateForm(nonExistentForm.Id, nonExistentForm);
// Assert
Assert.Null(result);
}
}
[Fact]
public async Task DeleteForm_NonExistentId_ReturnsNull()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var service = new DbManagerFormulaire(context);
// Act
var result = await service.DeleteForm(999); // Assuming this ID doesn't exist
// Assert
Assert.Null(result);
}
}
[Fact]
public async Task GetAllForm_InvalidCriteria_ReturnsAllWithoutOrder()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
context.FormSet.AddRange(
new FormEntity { Theme = "C", DatePublication = "2021-01-01", Link = "http://c.com", UserEntityPseudo = "user1"},
new FormEntity { Theme = "A", DatePublication = "2021-01-01", Link = "http://a.com", UserEntityPseudo = "user2"},
new FormEntity { Theme = "B", DatePublication = "2021-01-01", Link = "http://b.com", UserEntityPseudo = "user3"}
);
context.SaveChanges();
var service = new DbManagerFormulaire(context);
// Act
var forms = await service.GetAllForm(0, 10, (FormOrderCriteria)(-1));
// Assert
Assert.Equal(3, forms.Count());
}
}
}

@ -0,0 +1,35 @@
using DbContextLib;
using DbDataManager;
using Moq;
namespace API_Unit_Test;
public class DbManagerTests
{
[Fact]
public void Constructor_WithoutParameters_InitializesServices()
{
// Arrange & Act
var dbManager = new DbManager();
// Assert
Assert.NotNull(dbManager.ArticleService);
Assert.NotNull(dbManager.UserService);
Assert.NotNull(dbManager.FormulaireService);
}
[Fact]
public void Constructor_WithLibraryContextParameter_InitializesServicesWithGivenContext()
{
// Arrange
var context = new Mock<LibraryContext>().Object;
// Act
var dbManager = new DbManager(context);
// Assert
Assert.NotNull(dbManager.ArticleService);
Assert.NotNull(dbManager.UserService);
Assert.NotNull(dbManager.FormulaireService);
}
}

@ -0,0 +1,250 @@
using DbContextLib;
using DbDataManager;
using Entities;
using Microsoft.EntityFrameworkCore;
using Model;
namespace API_Unit_Test;
public class DbManagerUserTests
{
private LibraryContext GetInMemoryDbContext()
{
var options = new DbContextOptionsBuilder<LibraryContext>()
.UseInMemoryDatabase(databaseName: "LibraryDbInMemory")
.Options;
var dbContext = new LibraryContext(options);
dbContext.Database.EnsureDeleted();
dbContext.Database.EnsureCreated();
return dbContext;
}
[Fact]
public async Task GetAll_ReturnsCorrectUsers()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
context.UserSet.AddRange(new UserEntity { Pseudo = "user1" }, new UserEntity { Pseudo = "user2" });
context.SaveChanges();
var service = new DbManagerUser(context);
// Act
var users = await service.GetAll(0, 10, UserOrderCriteria.None);
// Assert
Assert.Equal(2, users.Count());
}
}
[Fact]
public async Task GetByPseudo_UserExists_ReturnsUser()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var pseudo = "user1";
context.UserSet.Add(new UserEntity { Pseudo = pseudo });
context.SaveChanges();
var service = new DbManagerUser(context);
// Act
var user = await service.GetByPseudo(pseudo);
// Assert
Assert.NotNull(user);
Assert.Equal(pseudo, user.Pseudo);
}
}
[Fact]
public async Task Create_AddsUserSuccessfully()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var service = new DbManagerUser(context);
var newUser = new User { Pseudo = "newUser", Nom = "Doe", Prenom = "John", Mdp = "password", Mail = "mail@mail.com", Role = "Admin" };
// Act
var createdUser = await service.Create(newUser);
// Assert
Assert.NotNull(createdUser);
Assert.Equal("newUser", createdUser.Pseudo);
}
}
[Fact]
public async Task Update_UpdatesUserSuccessfully()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var pseudo = "userToUpdate";
context.UserSet.Add(new UserEntity { Pseudo = pseudo });
context.SaveChanges();
var service = new DbManagerUser(context);
var updatedInfo = new User { Pseudo = pseudo, Nom = "UpdatedLastName" };
// Act
var updatedUser = await service.Update(updatedInfo, pseudo);
// Assert
Assert.NotNull(updatedUser);
Assert.Equal("UpdatedLastName", updatedUser.Nom);
}
}
[Fact]
public async Task Delete_RemovesUserSuccessfully()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var pseudo = "userToDelete";
context.UserSet.Add(new UserEntity { Pseudo = pseudo });
context.SaveChanges();
var service = new DbManagerUser(context);
// Act
var deletedUser = await service.Delete(pseudo);
// Assert
Assert.NotNull(deletedUser);
Assert.Empty(context.UserSet.Where(u => u.Pseudo == pseudo));
}
}
[Fact]
public async Task GetAllArticleUsers_ReturnsCorrectUsers()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var userPseudo = "user1";
var articleId = 1L;
context.UserSet.Add(new UserEntity { Pseudo = userPseudo });
context.ArticleUserSet.Add(new ArticleUserEntity { UserEntityPseudo = userPseudo, ArticleEntityId = articleId });
context.SaveChanges();
var service = new DbManagerUser(context);
// Act
var users = await service.GetAllArticleUsers();
// Assert
Assert.Single(users);
Assert.Contains(users, u => u.Pseudo == userPseudo);
}
}
[Fact]
public async Task GetArticleUser_ReturnsCorrectArticles()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var userPseudo = "userWithArticle";
var articleId = 2L;
context.UserSet.Add(new UserEntity { Pseudo = userPseudo });
context.ArticleSet.Add(new ArticleEntity { Id = articleId, Title = "Test Article" });
context.ArticleUserSet.Add(new ArticleUserEntity { UserEntityPseudo = userPseudo, ArticleEntityId = articleId });
context.SaveChanges();
var service = new DbManagerUser(context);
// Act
var articles = await service.GetArticleUser(userPseudo);
// Assert
Assert.Single(articles);
Assert.Contains(articles, a => a.Id == articleId);
}
}
[Fact]
public async Task CreateArticleUser_AddsRelationshipSuccessfully()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var userPseudo = "newUserForArticle";
var articleId = 3L;
context.UserSet.Add(new UserEntity { Pseudo = userPseudo });
context.ArticleSet.Add(new ArticleEntity { Id = articleId, Title = "New Article" });
context.SaveChanges();
var service = new DbManagerUser(context);
var newArticleUser = new ArticleUserEntity { UserEntityPseudo = userPseudo, ArticleEntityId = articleId };
// Act
var success = await service.CreateArticleUser(newArticleUser);
// Assert
Assert.True(success);
Assert.NotNull(context.ArticleUserSet.FirstOrDefault(au => au.UserEntityPseudo == userPseudo && au.ArticleEntityId == articleId));
}
}
[Fact]
public async Task DeleteArticleUser_RemovesRelationshipSuccessfully()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var userPseudo = "userToDeleteArticle";
var articleId = 4L;
context.UserSet.Add(new UserEntity { Pseudo = userPseudo });
context.ArticleSet.Add(new ArticleEntity { Id = articleId });
context.ArticleUserSet.Add(new ArticleUserEntity { UserEntityPseudo = userPseudo, ArticleEntityId = articleId });
context.SaveChanges();
var service = new DbManagerUser(context);
// Act
var success = await service.DeleteArticleUser(userPseudo, articleId);
// Assert
Assert.True(success);
Assert.DoesNotContain(context.ArticleUserSet, au => au.UserEntityPseudo == userPseudo && au.ArticleEntityId == articleId);
}
}
[Fact]
public async Task UpdateArticleUser_UpdatesRelationshipSuccessfully()
{
using (var context = GetInMemoryDbContext())
{
// Arrange
var userPseudo = "userToUpdateArticle";
var originalArticleId = 5L;
var newArticleId = 6L;
context.UserSet.Add(new UserEntity { Pseudo = userPseudo });
context.ArticleSet.Add(new ArticleEntity { Id = originalArticleId });
context.ArticleSet.Add(new ArticleEntity { Id = newArticleId });
context.ArticleUserSet.Add(new ArticleUserEntity { UserEntityPseudo = userPseudo, ArticleEntityId = originalArticleId });
context.SaveChanges();
var service = new DbManagerUser(context);
// Act
var success = await service.DeleteArticleUser(userPseudo, originalArticleId);
Assert.True(success);
var updatedArticleUser = new ArticleUserEntity { UserEntityPseudo = userPseudo, ArticleEntityId = newArticleId };
success = await service.CreateArticleUser(updatedArticleUser);
// Assert
Assert.True(success);
var relationship = context.ArticleUserSet.FirstOrDefault(au => au.UserEntityPseudo == userPseudo);
Assert.NotNull(relationship);
Assert.Equal(newArticleId, relationship.ArticleEntityId);
}
}
}

@ -0,0 +1,63 @@
using DbDataManager;
using Entities;
using Model;
namespace API_Unit_Test;
public class ExtensionsTests
{
[Fact]
public void ArticleToEntityMapsCorrectly()
{
// Arrange
var article = new Article
{
Id = 1,
Author = "Author",
Description = "Description",
Title = "Title",
DatePublished = "2021-01-01",
LectureTime = 10
};
// Act
var entity = article.ToEntity();
// Assert
Assert.NotNull(entity);
Assert.Equal(article.Id, entity.Id);
Assert.Equal(article.Author, entity.Author);
Assert.Equal(article.Description, entity.Description);
Assert.Equal(article.Title, entity.Title);
Assert.Equal(article.DatePublished, entity.DatePublished);
Assert.Equal(article.LectureTime, entity.LectureTime);
}
[Fact]
public void ArticleEntityToModelMapsCorrectly()
{
// Arrange
var entity = new ArticleEntity
{
Id = 1,
Author = "Author",
Description = "Description",
Title = "Title",
DatePublished = "2021-01-01",
LectureTime = 10
};
// Act
var model = entity.ToModel();
// Assert
Assert.NotNull(model);
Assert.Equal(entity.Id, model.Id);
Assert.Equal(entity.Author, model.Author);
Assert.Equal(entity.Description, model.Description);
Assert.Equal(entity.Title, model.Title);
Assert.Equal(entity.DatePublished, model.DatePublished);
Assert.Equal(entity.LectureTime, model.LectureTime);
}
}

@ -0,0 +1,70 @@
using API_Mapping;
using Model;
using Web_API.Model;
namespace API_UnitTest_Mapper;
public class FormMapperTests
{
[Fact]
public void ToDTOMapsCorrectly()
{
var formulaire = new Formulaire
{
Id = 1,
Theme = "Test Theme",
Date = "2021-01-01",
Lien = "http://example.com",
UserPseudo = "TestUser"
};
var dto = FormulaireMapping.ToDTO(formulaire);
Assert.NotNull(dto);
Assert.Equal(formulaire.Id, dto.Id);
Assert.Equal(formulaire.Theme, dto.Theme);
Assert.Equal(formulaire.Date, dto.Date);
Assert.Equal(formulaire.Lien, dto.Lien);
Assert.Equal(formulaire.UserPseudo, dto.UserPseudo);
}
[Fact]
public void ToModelMapsCorrectly()
{
var dto = new FormulaireDTO
{
Id = 2,
Theme = "Another Test Theme",
Date = "2021-01-02",
Lien = "http://anotherexample.com",
UserPseudo = "AnotherTestUser"
};
var formulaire = FormulaireMapping.ToModel(dto);
Assert.NotNull(formulaire);
Assert.Equal(dto.Id, formulaire.Id);
Assert.Equal(dto.Theme, formulaire.Theme);
Assert.Equal(dto.Date, formulaire.Date);
Assert.Equal(dto.Lien, formulaire.Lien);
Assert.Equal(dto.UserPseudo, formulaire.UserPseudo);
}
[Fact]
public void ToDTONullFormulaireThrowsNullReferenceException()
{
Formulaire formulaire = null;
Assert.Throws<NullReferenceException>(() => FormulaireMapping.ToDTO(formulaire));
}
[Fact]
public void ToModelNullFormulaireDTOThrowsNullReferenceException()
{
FormulaireDTO dto = null;
Assert.Throws<NullReferenceException>(() => FormulaireMapping.ToModel(dto));
}
}

@ -0,0 +1,111 @@
using API.Controllers;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Model;
using Moq;
namespace API_Unit_Test;
public class FormulaireControllerTests
{
private readonly Mock<IDataManager> _mockDataManager;
private readonly Mock<ILogger<FormulaireController>> _mockLogger;
private readonly FormulaireController _controller;
public FormulaireControllerTests()
{
_mockDataManager = new Mock<IDataManager>();
_mockLogger = new Mock<ILogger<FormulaireController>>();
_controller = new FormulaireController(_mockDataManager.Object, _mockLogger.Object);
}
[Fact]
public async Task GetAllForm_ReturnsOk()
{
// Arrange
_mockDataManager.Setup(dm => dm.FormulaireService.GetAllForm(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<FormOrderCriteria>()))
.ReturnsAsync(new List<Formulaire>());
// Act
var result = await _controller.GetAllForm();
// Assert
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task GetById_ReturnsOk()
{
// Arrange
var testFormId = 1L;
_mockDataManager.Setup(dm => dm.FormulaireService.GetById(testFormId))
.ReturnsAsync(new Formulaire { Id = testFormId });
// Act
var result = await _controller.GetById(testFormId);
// Assert
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task CreateForm_ReturnsOk()
{
// Arrange
var form = new Formulaire { Theme = "Test" };
_mockDataManager.Setup(dm => dm.FormulaireService.CreateForm(form))
.ReturnsAsync(form);
// Act
var result = await _controller.CreateForm(form);
// Assert
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task DeleteForm_ReturnsOk()
{
// Arrange
var testFormId = 1L;
_mockDataManager.Setup(dm => dm.FormulaireService.DeleteForm(testFormId))
.ReturnsAsync(new Formulaire { Id = testFormId });
// Act
var result = await _controller.DeleteForm(testFormId);
// Assert
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task UpdateForm_ReturnsOk()
{
// Arrange
var testFormId = 1L;
var form = new Formulaire { Theme = "Updated" };
_mockDataManager.Setup(dm => dm.FormulaireService.UpdateForm(testFormId, form))
.ReturnsAsync(form);
// Act
var result = await _controller.UpdateForm(testFormId, form);
// Assert
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task GetAllForm_ThrowsException_ReturnsBadRequest()
{
// Arrange
_mockDataManager.Setup(dm => dm.FormulaireService.GetAllForm(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<FormOrderCriteria>()))
.ThrowsAsync(new Exception("Test exception"));
// Act
var result = await _controller.GetAllForm();
// Assert
Assert.IsType<BadRequestObjectResult>(result);
}
}

@ -0,0 +1,27 @@
using Web_API.Model;
namespace API_Unit_Test;
public class FormulaireDTOTests
{
[Fact]
public void PropertiesTest()
{
// Arrange
var formulaire = new FormulaireDTO
{
Id = 1,
Theme = "Test Theme",
Date = "2024-03-16",
Lien = "http://example.com",
UserPseudo = "TestUser"
};
// Act & Assert
Assert.Equal(1, formulaire.Id);
Assert.Equal("Test Theme", formulaire.Theme);
Assert.Equal("2024-03-16", formulaire.Date);
Assert.Equal("http://example.com", formulaire.Lien);
Assert.Equal("TestUser", formulaire.UserPseudo);
}
}

@ -4,7 +4,7 @@ using Moq;
namespace API_Unit_Test; namespace API_Unit_Test;
public class UnitTest_Article public class IArticleServiceTests
{ {

@ -4,7 +4,7 @@ using Moq;
namespace API_Unit_Test; namespace API_Unit_Test;
public class UnitTest_Form public class IFormServiceTests
{ {
[Fact] [Fact]
public void TestGetAllForm() public void TestGetAllForm()

@ -5,7 +5,7 @@ using Moq;
namespace API_Unit_Test; namespace API_Unit_Test;
public class UnitTest_User public class IUserServiceTests
{ {
[Fact] [Fact]

@ -0,0 +1,141 @@
using API_Mapping;
using API.Controllers;
using Entities;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Model;
using Moq;
using Web_API.Model;
namespace API_Unit_Test;
public class UserControllerTests
{
private readonly Mock<IDataManager> _mockDataManager;
private readonly Mock<ILogger<UserController>> _mockLogger;
private readonly UserController _controller;
public UserControllerTests()
{
_mockDataManager = new Mock<IDataManager>();
_mockLogger = new Mock<ILogger<UserController>>();
_controller = new UserController(_mockDataManager.Object, _mockLogger.Object);
}
[Fact]
public async Task GetAll_ReturnsOk()
{
_mockDataManager.Setup(dm => dm.UserService.GetAll(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<UserOrderCriteria>()))
.ReturnsAsync(new List<User>());
var result = await _controller.GetAll();
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task GetByPseudo_ReturnsOk()
{
var pseudo = "testUser";
_mockDataManager.Setup(dm => dm.UserService.GetByPseudo(pseudo))
.ReturnsAsync(new User { Pseudo = pseudo });
var result = await _controller.GetByPseudo(pseudo);
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task Create_ReturnsOk()
{
var user = new User { Pseudo = "newUser" };
_mockDataManager.Setup(dm => dm.UserService.Create(user))
.ReturnsAsync(user);
var result = await _controller.Create(user);
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task Update_ReturnsOk()
{
var pseudo = "existingUser";
var user = new User { Pseudo = pseudo };
_mockDataManager.Setup(dm => dm.UserService.Update(user, pseudo))
.ReturnsAsync(user);
var result = await _controller.Update(user, pseudo);
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task Delete_ReturnsOk()
{
var pseudo = "deleteUser";
_mockDataManager.Setup(dm => dm.UserService.Delete(pseudo))
.ReturnsAsync(new User { Pseudo = pseudo });
var result = await _controller.Delete(pseudo);
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task Create_ThrowsException_ReturnsBadRequest()
{
var user = new User { Pseudo = "errorUser" };
_mockDataManager.Setup(dm => dm.UserService.Create(user))
.ThrowsAsync(new Exception("Test exception"));
var result = await _controller.Create(user);
Assert.IsType<BadRequestObjectResult>(result);
}
[Fact]
public async Task CreateArticleUser_ReturnsOk_WithNewArticleUser()
{
// Arrange
var articleUser = new ArticleUserEntity { UserEntityPseudo = "User1", ArticleEntityId = 1 };
_mockDataManager.Setup(m => m.UserService.CreateArticleUser(articleUser)).ReturnsAsync(true);
// Act
var result = await _controller.CreateArticleUser(articleUser);
// Assert
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task UpdateArticleUser_ReturnsOk_WhenUpdated()
{
// Arrange
var articleUser = new ArticleUserEntity { UserEntityPseudo = "User1", ArticleEntityId = 2 };
_mockDataManager.Setup(m => m.UserService.DeleteArticleUser(It.IsAny<string>(), It.IsAny<long>())).ReturnsAsync(true);
_mockDataManager.Setup(m => m.UserService.CreateArticleUser(It.IsAny<ArticleUserEntity>())).ReturnsAsync(true);
// Act
var result = await _controller.UpdateArticleUser(articleUser, 1);
// Assert
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async Task DeleteArticleUser_ReturnsOk_WhenDeleted()
{
// Arrange
_mockDataManager.Setup(m => m.UserService.DeleteArticleUser(It.IsAny<string>(), It.IsAny<long>())).ReturnsAsync(true);
// Act
var result = await _controller.DeleteArticleUser("User1", 1);
// Assert
Assert.IsType<OkObjectResult>(result);
}
}

@ -0,0 +1,29 @@
using Web_API.Model;
namespace API_Unit_Test;
public class UserDTOTests
{
[Fact]
public void UserDTOPropertiesTest()
{
// Arrange
var user = new UserDTO
{
Pseudo = "user1",
Mdp = "password",
Nom = "Doe",
Prenom = "John",
Mail = "john.doe@example.com",
Role = "Admin"
};
// Act & Assert
Assert.Equal("user1", user.Pseudo);
Assert.Equal("password", user.Mdp);
Assert.Equal("Doe", user.Nom);
Assert.Equal("John", user.Prenom);
Assert.Equal("john.doe@example.com", user.Mail);
Assert.Equal("Admin", user.Role);
}
}

@ -0,0 +1,120 @@
using API_Mapping;
using Model;
using Web_API.Model;
namespace API_UnitTest_Mapper;
public class UserMappingTests
{
[Fact]
public void ToDTOMapsCorrectly()
{
// Arrange
var user = new User
{
Pseudo = "testUser",
Mdp = "testPassword",
Nom = "Doe",
Prenom = "John",
Mail = "john.doe@example.com",
Role = "User"
};
// Act
var dto = UserMapping.ToDTO(user);
// Assert
Assert.NotNull(dto);
Assert.Equal(user.Pseudo, dto.Pseudo);
Assert.Equal(user.Mdp, dto.Mdp);
Assert.Equal(user.Nom, dto.Nom);
Assert.Equal(user.Prenom, dto.Prenom);
Assert.Equal(user.Mail, dto.Mail);
Assert.Equal(user.Role, dto.Role);
}
[Fact]
public void ToModelMapsCorrectly()
{
// Arrange
var dto = new UserDTO
{
Pseudo = "anotherTestUser",
Mdp = "anotherTestPassword",
Nom = "Smith",
Prenom = "Jane",
Mail = "jane.smith@example.com",
Role = "Admin"
};
// Act
var user = UserMapping.ToModel(dto);
// Assert
Assert.NotNull(user);
Assert.Equal(dto.Pseudo, user.Pseudo);
Assert.Equal(dto.Mdp, user.Mdp);
Assert.Equal(dto.Nom, user.Nom);
Assert.Equal(dto.Prenom, user.Prenom);
Assert.Equal(dto.Mail, user.Mail);
Assert.Equal(dto.Role, user.Role);
}
[Fact]
public void ToDTONullUserThrowsNullReferenceException()
{
// Arrange
User user = null;
// Act & Assert
Assert.Throws<NullReferenceException>(() => UserMapping.ToDTO(user));
}
[Fact]
public void ToModelNullUserDTOThrowsNullReferenceException()
{
// Arrange
UserDTO dto = null;
// Act & Assert
Assert.Throws<NullReferenceException>(() => UserMapping.ToModel(dto));
}
[Fact]
public void ToDTOMapsCorrectlyWithEmptyUser()
{
// Arrange
var user = new User();
// Act
var dto = UserMapping.ToDTO(user);
// Assert
Assert.NotNull(dto);
Assert.Equal(user.Pseudo, dto.Pseudo);
Assert.Equal(user.Mdp, dto.Mdp);
Assert.Equal(user.Nom, dto.Nom);
Assert.Equal(user.Prenom, dto.Prenom);
Assert.Equal(user.Mail, dto.Mail);
Assert.Equal(user.Role, dto.Role);
}
[Fact]
public void ToModelMapsCorrectlyWithEmptyUserDTO()
{
// Arrange
var dto = new UserDTO();
// Act
var user = UserMapping.ToModel(dto);
// Assert
Assert.NotNull(user);
Assert.Equal(dto.Pseudo, user.Pseudo);
Assert.Equal(dto.Mdp, user.Mdp);
Assert.Equal(dto.Nom, user.Nom);
Assert.Equal(dto.Prenom, user.Prenom);
Assert.Equal(dto.Mail, user.Mail);
Assert.Equal(dto.Role, user.Role);
}
}

@ -56,6 +56,8 @@ public class LibraryContext : DbContext
.HasOne(f => f.User) .HasOne(f => f.User)
.WithMany(u => u.Forms) .WithMany(u => u.Forms)
.HasForeignKey(f => f.UserEntityPseudo); .HasForeignKey(f => f.UserEntityPseudo);
// En cas de besoin, decomenter les lignes suivantes afin de faire la migration
/* /*
modelBuilder.Entity<ArticleEntity>().HasData( modelBuilder.Entity<ArticleEntity>().HasData(
new ArticleEntity new ArticleEntity
@ -145,6 +147,7 @@ public class LibraryContext : DbContext
new FormEntity new FormEntity
{ {
Id = 1, Id = 1,
Theme = "Form 1 Theme",
DatePublication = "Form 1 Description", DatePublication = "Form 1 Description",
Link = "hhtp://form1.com", Link = "hhtp://form1.com",
UserEntityPseudo = "Sha" UserEntityPseudo = "Sha"
@ -152,6 +155,7 @@ public class LibraryContext : DbContext
new FormEntity new FormEntity
{ {
Id = 2, Id = 2,
Theme = "Form 2 Theme",
DatePublication = "Form 2 Description", DatePublication = "Form 2 Description",
Link = "hhtp://form2.com", Link = "hhtp://form2.com",
UserEntityPseudo = "Sha" UserEntityPseudo = "Sha"
@ -159,11 +163,13 @@ public class LibraryContext : DbContext
new FormEntity new FormEntity
{ {
Id = 3, Id = 3,
Theme = "Form 3 Theme",
DatePublication = "Form 3 Description", DatePublication = "Form 3 Description",
Link = "hhtp://form3.com", Link = "hhtp://form3.com",
UserEntityPseudo = "Sha" UserEntityPseudo = "Sha"
} }
); );
*/ */
} }
} }

@ -10,14 +10,14 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace DbContextLib.Migrations namespace DbContextLib.Migrations
{ {
[DbContext(typeof(LibraryContext))] [DbContext(typeof(LibraryContext))]
[Migration("20240312155559_mrg1")] [Migration("20240317095050_mrg1")]
partial class mrg1 partial class mrg1
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "8.0.2"); modelBuilder.HasAnnotation("ProductVersion", "8.0.3");
modelBuilder.Entity("Entities.ArticleEntity", b => modelBuilder.Entity("Entities.ArticleEntity", b =>
{ {
@ -154,7 +154,7 @@ namespace DbContextLib.Migrations
Id = 1L, Id = 1L,
DatePublication = "Form 1 Description", DatePublication = "Form 1 Description",
Link = "hhtp://form1.com", Link = "hhtp://form1.com",
Theme = "", Theme = "Form 1 Theme",
UserEntityPseudo = "Sha" UserEntityPseudo = "Sha"
}, },
new new
@ -162,7 +162,7 @@ namespace DbContextLib.Migrations
Id = 2L, Id = 2L,
DatePublication = "Form 2 Description", DatePublication = "Form 2 Description",
Link = "hhtp://form2.com", Link = "hhtp://form2.com",
Theme = "", Theme = "Form 2 Theme",
UserEntityPseudo = "Sha" UserEntityPseudo = "Sha"
}, },
new new
@ -170,7 +170,7 @@ namespace DbContextLib.Migrations
Id = 3L, Id = 3L,
DatePublication = "Form 3 Description", DatePublication = "Form 3 Description",
Link = "hhtp://form3.com", Link = "hhtp://form3.com",
Theme = "", Theme = "Form 3 Theme",
UserEntityPseudo = "Sha" UserEntityPseudo = "Sha"
}); });
}); });

@ -130,9 +130,9 @@ namespace DbContextLib.Migrations
columns: new[] { "Id", "DatePublication", "Link", "Theme", "UserEntityPseudo" }, columns: new[] { "Id", "DatePublication", "Link", "Theme", "UserEntityPseudo" },
values: new object[,] values: new object[,]
{ {
{ 1L, "Form 1 Description", "hhtp://form1.com", "", "Sha" }, { 1L, "Form 1 Description", "hhtp://form1.com", "Form 1 Theme", "Sha" },
{ 2L, "Form 2 Description", "hhtp://form2.com", "", "Sha" }, { 2L, "Form 2 Description", "hhtp://form2.com", "Form 2 Theme", "Sha" },
{ 3L, "Form 3 Description", "hhtp://form3.com", "", "Sha" } { 3L, "Form 3 Description", "hhtp://form3.com", "Form 3 Theme", "Sha" }
}); });
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(

@ -14,7 +14,7 @@ namespace DbContextLib.Migrations
protected override void BuildModel(ModelBuilder modelBuilder) protected override void BuildModel(ModelBuilder modelBuilder)
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "8.0.2"); modelBuilder.HasAnnotation("ProductVersion", "8.0.3");
modelBuilder.Entity("Entities.ArticleEntity", b => modelBuilder.Entity("Entities.ArticleEntity", b =>
{ {
@ -151,7 +151,7 @@ namespace DbContextLib.Migrations
Id = 1L, Id = 1L,
DatePublication = "Form 1 Description", DatePublication = "Form 1 Description",
Link = "hhtp://form1.com", Link = "hhtp://form1.com",
Theme = "", Theme = "Form 1 Theme",
UserEntityPseudo = "Sha" UserEntityPseudo = "Sha"
}, },
new new
@ -159,7 +159,7 @@ namespace DbContextLib.Migrations
Id = 2L, Id = 2L,
DatePublication = "Form 2 Description", DatePublication = "Form 2 Description",
Link = "hhtp://form2.com", Link = "hhtp://form2.com",
Theme = "", Theme = "Form 2 Theme",
UserEntityPseudo = "Sha" UserEntityPseudo = "Sha"
}, },
new new
@ -167,7 +167,7 @@ namespace DbContextLib.Migrations
Id = 3L, Id = 3L,
DatePublication = "Form 3 Description", DatePublication = "Form 3 Description",
Link = "hhtp://form3.com", Link = "hhtp://form3.com",
Theme = "", Theme = "Form 3 Theme",
UserEntityPseudo = "Sha" UserEntityPseudo = "Sha"
}); });
}); });

@ -0,0 +1,35 @@
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
EXPOSE 8080
EXPOSE 8081
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["API/API.csproj", "API/"]
COPY ["API_DbDataManager/API_DbDataManager.csproj", "API_DbDataManager/"]
COPY ["API_Services/API_Services.csproj", "API_Services/"]
COPY ["Entities/Entities.csproj", "Entities/"]
COPY ["Model/Model.csproj", "Model/"]
COPY ["DbContextLib/DbContextLib.csproj", "DbContextLib/"]
COPY ["StubbedContextLib/StubbedContextLib.csproj", "StubbedContextLib/"]
COPY ["API_Mapping/API_Mapping.csproj", "API_Mapping/"]
COPY ["API_Model/API_Model.csproj", "API_Model/"]
RUN dotnet restore "API/API.csproj"
COPY . .
WORKDIR "/src/API"
RUN dotnet build "API.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "API.dll"]

@ -1,5 +1,8 @@
using System.Text.Json.Serialization;
namespace Model; namespace Model;
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ArticleOrderCriteria public enum ArticleOrderCriteria
{ {
None, ByTitle, ByAuthor, ByLectureTime, ByDatePublished, ByDescription None, ByTitle, ByAuthor, ByLectureTime, ByDatePublished, ByDescription

@ -1,5 +1,9 @@
using System.Text.Json.Serialization;
namespace Model; namespace Model;
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum FormOrderCriteria public enum FormOrderCriteria
{ {
None, ByTheme, ByDate, ByPseudo, ByLien None, ByTheme, ByDate, ByPseudo, ByLien

@ -0,0 +1,9 @@
using System.Text.Json.Serialization;
namespace Model;
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum UserOrderCriteria
{
None, ByFirstName, ByLastName
}

@ -1,2 +0,0 @@
# Verax_API_EF

@ -55,6 +55,14 @@ public class StubbedContext : LibraryContext
new UserEntity new UserEntity
{ {
Nom = "M&M's", Prenom = "Red", Pseudo = "RedM", Mail = "M&M#mail.com", Mdp = "1234", Role = "Modérator" Nom = "M&M's", Prenom = "Red", Pseudo = "RedM", Mail = "M&M#mail.com", Mdp = "1234", Role = "Modérator"
},
new UserEntity
{
Nom = "Cascarra", Prenom = "Cascarra", Pseudo = "Sha", Mail = "ShaCasca@gmail.com", Mdp = "1234", Role = "Admin"
},
new UserEntity
{
Nom = "Sillard", Prenom = "Noa", Pseudo = "NoaSil", Mail = "", Mdp = "1234", Role = "Admin"
} }
); );
@ -62,12 +70,12 @@ public class StubbedContext : LibraryContext
new ArticleUserEntity new ArticleUserEntity
{ {
ArticleEntityId = 1, ArticleEntityId = 1,
UserEntityPseudo = "Sha" UserEntityPseudo = "TonyF"
}, },
new ArticleUserEntity new ArticleUserEntity
{ {
ArticleEntityId = 2, ArticleEntityId = 2,
UserEntityPseudo = "Sha" UserEntityPseudo = "NoaSil"
}, },
new ArticleUserEntity new ArticleUserEntity
{ {
@ -77,11 +85,38 @@ public class StubbedContext : LibraryContext
new ArticleUserEntity new ArticleUserEntity
{ {
ArticleEntityId = 3, ArticleEntityId = 3,
UserEntityPseudo = "Sha" UserEntityPseudo = "RedM"
}, },
new ArticleUserEntity new ArticleUserEntity
{ {
ArticleEntityId = 2, ArticleEntityId = 2,
UserEntityPseudo = "TomS"
}
);
modelBuilder.Entity<FormEntity>().HasData(
new FormEntity
{
Id = 1,
Theme = "Form 1 Theme",
DatePublication = "Form 1 Description",
Link = "hhtp://form1.com",
UserEntityPseudo = "Sha"
},
new FormEntity
{
Id = 2,
Theme = "Form 2 Theme",
DatePublication = "Form 2 Description",
Link = "hhtp://form2.com",
UserEntityPseudo = "Sha"
},
new FormEntity
{
Id = 3,
Theme = "Form 3 Theme",
DatePublication = "Form 3 Description",
Link = "hhtp://form3.com",
UserEntityPseudo = "Sha" UserEntityPseudo = "Sha"
} }
); );

@ -26,6 +26,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DbContextLib\DbContextLib.csproj" /> <ProjectReference Include="..\DbContextLib\DbContextLib.csproj" />
<ProjectReference Include="..\Entities\Entities.csproj" /> <ProjectReference Include="..\Entities\Entities.csproj" />
<ProjectReference Include="..\StubbedContextLib\StubbedContextLib.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -1,15 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/.idea.Verax_API_EF.iml
/contentModel.xml
/projectSettingsUpdater.xml
/modules.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# GitHub Copilot persisted chat sessions
/copilot/chatSessions

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="" />
</component>
</project>

@ -0,0 +1,313 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoGeneratedRunConfigurationManager">
<projectFile profileName="http">API/API.csproj</projectFile>
<projectFile profileName="https">API/API.csproj</projectFile>
<projectFile>API_Tests_Console/API_Tests_Console.csproj</projectFile>
<projectFile>Test_Console_EF/Test_Console_EF.csproj</projectFile>
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="0b890b11-446c-405a-95d5-cd68743c4057" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/.idea/.idea.Verax_API_EF/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/.idea.Verax_API_EF/.idea/indexLayout.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/.idea.Verax_API_EF/.idea/vcs.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API/API.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API/API.http" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API/Controllers/ArticleController.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API/Controllers/FormulaireController.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API/Controllers/UserController.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API/Entity_FrameWork.Article.db" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API/Program.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API/Properties/launchSettings.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API/appsettings.Development.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API/appsettings.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API/log.txt" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_DbDataManager/API_DbDataManager.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_DbDataManager/DbManager.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_DbDataManager/DbManagerArticle.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_DbDataManager/DbManagerFormulaire.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_DbDataManager/DbManagerUser.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_DbDataManager/Extensions.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Mapping/API_Mapping.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Mapping/ArticleMapper.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Mapping/FormulaireMapping.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Mapping/UserMapping.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Model/API_Model.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Model/ArticleDTO.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Model/FormulaireDTO.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Model/UserDTO.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Services/API_Services.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Services/IArticleService.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Services/IDataManager.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Services/IFormulaireService.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Services/IUserService.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Tests_Console/API_Tests_Console.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Tests_Console/Tests_Console.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_UnitTest_Mapper/API_UnitTest_Mapper.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_UnitTest_Mapper/GlobalUsings.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/API_Unit_Test.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/ArticleControllerTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/ArticleDTOTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/ArticleMapperTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/DbManagerArticleTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/DbManagerFormulaireTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/DbManagerTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/DbManagerUserTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/ExtensionsTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/FormMapperTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/FormulaireControllerTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/FormulaireDTOTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/GlobalUsings.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/IArticleServiceTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/IFormServiceTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/IUserServiceTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/UserControllerTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/UserDTOTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/API_Unit_Test/UserMappingTests.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/DbContextLib/ApplicationDbContext.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/DbContextLib/DbContextLib.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/DbContextLib/LibraryContext.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/DbContextLib/Migrations/20240317095050_mrg1.Designer.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/DbContextLib/Migrations/20240317095050_mrg1.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/DbContextLib/Migrations/LibraryContextModelSnapshot.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Dockerfile" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Entities/ArticleEntity.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Entities/ArticleUserEntity.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Entities/Entities.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Entities/FormEntity.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Entities/UserEntity.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Model/Article.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Model/ArticleOrderCriteria.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Model/FormOrderCriteria.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Model/Formulaire.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Model/Model.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Model/User.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Model/UserOrderCriteria.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/StubbedContextLib/Class1.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/StubbedContextLib/StubbedContextLib.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Test_Console_EF/Entity_FrameWork.Article.db" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Test_Console_EF/Test_Console_EF.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Test_Console_EF/Test_Console_EF.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Test_Console_EF/log.txt" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Unit_Test_EF/TestsArticleEntity.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Unit_Test_EF/TestsArticleUserEntity.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Unit_Test_EF/TestsFormEntity.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Unit_Test_EF/TestsUserEntity.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Unit_Test_EF/Unit_Test_EF.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Verax_API_EF.sln" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Verax_API_EF/.idea/.idea.Verax_API_EF.dir/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Verax_API_EF/.idea/.idea.Verax_API_EF.dir/.idea/indexLayout.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Verax_API_EF/.idea/.idea.Verax_API_EF.dir/.idea/vcs.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Verax_API_EF/Program.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Verax_API_EF/Verax_API_EF.csproj" beforeDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/../.." />
</component>
<component name="MetaFilesCheckinStateConfiguration" checkMetaFiles="true" />
<component name="ProblemsViewState">
<option name="selectedTabId" value="Toolset" />
</component>
<component name="ProjectColorInfo">{
&quot;customColor&quot;: &quot;&quot;,
&quot;associatedIndex&quot;: 8
}</component>
<component name="ProjectId" id="2eENYNJJTgbOpfWw136RJzo5ItR" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
".NET Launch Settings Profile.API: docker.executor": "Run",
".NET Launch Settings Profile.API: http.executor": "Run",
".NET Launch Settings Profile.API: https.executor": "Run",
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"git-widget-placeholder": "rebase",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"vue.rearranger.settings.migration": "true"
},
"keyToStringList": {
"rider.external.source.directories": [
"/Users/tonyfages/Library/Application Support/JetBrains/Rider2023.3/resharper-host/DecompilerCache",
"/Users/tonyfages/Library/Application Support/JetBrains/Rider2023.3/resharper-host/SourcesCache",
"/Users/tonyfages/.local/share/Symbols/src"
]
}
}]]></component>
<component name="RunManager" selected=".NET Launch Settings Profile.API: https">
<configuration name="API_Tests_Console" type="DotNetProject" factoryName=".NET Project">
<option name="EXE_PATH" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="PROJECT_PATH" value="$PROJECT_DIR$/API_Tests_Console/API_Tests_Console.csproj" />
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
<option name="PROJECT_KIND" value="DotNetCore" />
<option name="PROJECT_TFM" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="Test_Console_EF" type="DotNetProject" factoryName=".NET Project">
<option name="EXE_PATH" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="PROJECT_PATH" value="$PROJECT_DIR$/Test_Console_EF/Test_Console_EF.csproj" />
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
<option name="PROJECT_KIND" value="DotNetCore" />
<option name="PROJECT_TFM" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="API: Docker" type="LaunchSettings" factoryName=".NET Launch Settings Profile" temporary="true">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/API/API.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="Docker" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="API: docker" type="LaunchSettings" factoryName=".NET Launch Settings Profile" temporary="true">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/API/API.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="docker" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="API: http" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/API/API.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="http" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="API: https" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/API/API.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="https" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="../Dockerfile: Compose Deployment" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="api" />
<option name="containerName" value="api" />
<option name="contextFolderPath" value="$PROJECT_DIR$" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="8080" />
<option name="hostIp" value="127.0.0.1" />
<option name="hostPort" value="8080" />
</DockerPortBindingImpl>
</list>
</option>
<option name="sourceFilePath" value="../Dockerfile" />
</settings>
</deployment>
<EXTENSION ID="com.jetbrains.rider.docker.debug" isFastModeEnabled="true" isSslEnabled="false" />
<method v="2" />
</configuration>
<configuration default="true" type="docker-deploy" factoryName="dockerfile" temporary="true">
<deployment type="dockerfile" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue=".NET Launch Settings Profile.API: Docker" />
<item itemvalue=".NET Launch Settings Profile.API: docker" />
</list>
</recent_temporary>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="0b890b11-446c-405a-95d5-cd68743c4057" name="Changes" comment="" />
<created>1711465825676</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1711465825676</updated>
<workItem from="1711465828197" duration="234000" />
<workItem from="1711466068272" duration="848000" />
<workItem from="1711468488298" duration="751000" />
<workItem from="1712036968994" duration="2827000" />
</task>
<task id="LOCAL-00001" summary="Dockerfile">
<option name="closed" value="true" />
<created>1712038898812</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1712038898812</updated>
</task>
<option name="localTasksCounter" value="2" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="UnityCheckinConfiguration" checkUnsavedScenes="true" />
<component name="VcsManagerConfiguration">
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" />
<MESSAGE value="Dockerfile" />
<option name="LAST_COMMIT_MESSAGE" value="Dockerfile" />
</component>
</project>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save