Compare commits

...

43 Commits

Author SHA1 Message Date
Lunastra
271f2df7f9 Merge branch 'newMain' 2022-01-04 13:58:51 -08:00
Im_Alpha
d550ad44df Added logging with references fixed 2022-01-04 13:57:23 -08:00
colincreasman
4f8aeaead8 Added in old code for logging library 2022-01-04 13:53:20 -08:00
colincreasman
a424b6f7a2 new DBLogger file using old code
new DBLogger file using old code
2022-01-04 13:45:22 -08:00
Lunastra
27c322d759 Merge branch 'newMain' 2022-01-04 13:39:53 -08:00
Im_Alpha
8cda716487 Fixed namespace 2022-01-04 13:38:02 -08:00
Lunastra
3bf30af52f Merge branch 'newMain' 2022-01-04 13:27:09 -08:00
Im_Alpha
85c6f25721 Added Folders to match HLD 2022-01-04 13:23:18 -08:00
Im_Alpha
c139b80459 Moved logging into service layer 2022-01-04 13:20:16 -08:00
Im_Alpha
300158ec25 Renamed and moved to match HLD 2022-01-04 13:17:58 -08:00
Lunastra
f79dd88cc7 Merge branch 'newMain' 2022-01-04 12:59:32 -08:00
Lunastra
56c7725f56 Merge branch 'master' of https://github.com/long237/HobbyProject 2022-01-04 12:58:14 -08:00
Lunastra
d96d1f972b Ignore a binary folder 2022-01-04 12:57:47 -08:00
Lunastra
d8be0846fc Add missing comments 2022-01-04 12:56:54 -08:00
Im_Alpha
2c5dea12df Working Cleaned solution 2022-01-04 12:55:32 -08:00
long237
52f6a2b731
Delete binary folder in main directory 2022-01-04 12:02:13 -08:00
Lunastra
51b41fc9f7 ignore the 2 binary files 2021-12-15 20:29:29 -08:00
Lunastra
6319cc7693 Ignored binary folder for gitignore 2021-12-15 20:01:09 -08:00
Rifat Hasan
df7e6f9c5e
Add files via upload 2021-12-16 02:48:06 +00:00
Im_Alpha
19fdbc21f6 Merge branch 'master' of https://github.com/long237/HobbyProject 2021-12-15 18:40:25 -08:00
Im_Alpha
9afb9af9f6 updated text file path to new path 2021-12-15 18:40:16 -08:00
long237
7daf61c6bd
Ignore binary and debug folder 2021-12-15 18:39:26 -08:00
Im_Alpha
3c154ed8aa Merge branch 'Jacobs-Branch' 2021-12-15 18:38:02 -08:00
Im_Alpha
e7c11778ee fixed txt 2021-12-15 18:36:24 -08:00
long237
d989c5c840
Remove testingDB line 2021-12-15 18:36:23 -08:00
Im_Alpha
a87237fbf0 Revert "added text for bulk operation"
This reverts commit 1046293c9e.
2021-12-15 18:33:14 -08:00
Im_Alpha
0b182cb08c Merge branch 'Jacobs-Branch' 2021-12-15 18:29:19 -08:00
Im_Alpha
1046293c9e added text for bulk operation 2021-12-15 18:28:57 -08:00
long237
f62abbd1e5
not ignore debug 2021-12-15 18:27:18 -08:00
long237
c96b6eda56
Include binary folder 2021-12-15 18:22:47 -08:00
Im_Alpha
32be141e44 fixed solution file 2021-12-15 18:19:53 -08:00
Jacob Delgado
e1a2cb8b1b added drop database and fixed insert 2021-12-15 17:52:53 -08:00
Jacob Delgado
ff690dc836 added show tables when complete 2021-12-15 17:41:05 -08:00
Im_Alpha
f1dc060545 removed unused 2021-12-15 17:20:09 -08:00
Im_Alpha
ab2096492c removed unused 2021-12-15 17:18:49 -08:00
Im_Alpha
5dacebdffd Merge branch 'Jacobs-Branch' 2021-12-15 17:13:51 -08:00
Im_Alpha
27080ce36c fixed testing, add archive path to menu 2021-12-15 17:13:36 -08:00
DanBribi
b618041489
Add files via upload 2021-12-15 17:02:43 -08:00
DanBribi
8f364fb521
Delete Project Roadmap.drawio.png 2021-12-15 16:57:23 -08:00
DanBribi
fe4b2f891b
Delete Project Plan.pdf 2021-12-15 16:57:07 -08:00
DanBribi
699de5a7e6
Fixed test cases (#18) 2021-12-15 16:44:21 -08:00
Im_Alpha
f11ed7d6ad Merge branch 'Jacobs-Branch' into Rifats_tests 2021-12-15 15:37:42 -08:00
Rifat Hasan
8d49e66a90 Add operations for single and bulk 2021-12-15 15:36:47 -08:00
66 changed files with 1495 additions and 1592 deletions

4
.gitignore vendored
View File

@ -425,3 +425,7 @@ healthchecksdb
.vscode/tasks.json .vscode/tasks.json
Source Code/.vscode/tasks.json Source Code/.vscode/tasks.json
Source Code/.vscode/launch.json Source Code/.vscode/launch.json
Source Code/TeamHobby.HobbyProjectGenerator/TeamHobby.Archiving.xTests/bin/Debug/net6.0/CoverletSourceRootsMapping
Source Code/TeamHobby.HobbyProjectGenerator/TeamHobby.UserManagement.xTests/bin/Debug/net6.0/CoverletSourceRootsMapping
Source Code/TeamHobby.HobbyProjectGenerator/TeamHobby.Archiving.xTests/bin/Debug/net6.0/CoverletSourceRootsMapping
Source Code/TeamHobby.HobbyProjectGenerator/TeamHobby.UserManagement.xTests/bin/Debug/net6.0/CoverletSourceRootsMapping

View File

@ -1,26 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
"name": ".NET Core Launch (console)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/main/bin/Debug/net6.0/main.dll",
"args": [],
"cwd": "${workspaceFolder}/main",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}

View File

@ -1,42 +0,0 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/main/main.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/main/main.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"${workspaceFolder}/main/main.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
}
]
}

View File

@ -1,25 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Platforms>AnyCPU;x86</Platforms>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.SqlClient" Version="4.0.0" />
<PackageReference Include="MySql.Data" Version="8.0.27" />
<PackageReference Include="System.Data.Odbc" Version="6.0.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.3" />
</ItemGroup>
<ItemGroup>
<Folder Include="Implementations\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TeamHobby.HobbyProjectGenerator.DataAccess\TeamHobby.HobbyProjectGenerator.DataAccess.csproj" />
</ItemGroup>
</Project>

View File

@ -1,25 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Platforms>AnyCPU;x86</Platforms>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.SqlClient" Version="4.0.0" />
<PackageReference Include="MySql.Data" Version="8.0.27" />
<PackageReference Include="System.Data.Odbc" Version="6.0.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.3" />
</ItemGroup>
<ItemGroup>
<Folder Include="Implementations\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TeamHobby.HobbyProjectGenerator.DataAccess\TeamHobby.HobbyProjectGenerator.DataAccess.csproj" />
</ItemGroup>
</Project>

View File

@ -1,342 +0,0 @@
using System;
using System.Collections.Generic;
using System.Data.Odbc;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TeamHobby.HobbyProjectGenerator.Archive;
using TeamHobby.HobbyProjectGenerator.DataAccess;
namespace TeamHobby.HobbyProjectGenerator.ArchiveTests
{
public class ArchivingTests
{
//private string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
// "SERVER=localhost;" +
// "DATABASE=hobby;" +
// "UID=root;" +
// "PASSWORD=Teamhobby;" +
// "OPTION=3";
// [TestMethod]
public void IsArchiveFolderCreated(IDataSource<string> sqlDAO)
{
// Arrange
//SqlDAO sqlDAO = new SqlDAO(dbInfo);
ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
string folderPath = @"C:/HobbyArchive";
bool expectedVal = true;
// Act
archiveManager.CreateArchiveFolder();
// Assert
bool actualVal = Directory.Exists(folderPath);
if (expectedVal == actualVal)
{
Console.WriteLine("Expected: {0}, Actual: {1}. Folder created correctly", expectedVal, actualVal);
try
{
Directory.Delete(folderPath, true);
}
catch {
Console.WriteLine("Folder failed to be deleted");
}
}
else
{
Console.WriteLine("Expected: {0}, Actual: {1}. Folder created incorrectly", expectedVal, actualVal);
}
}
// [TestMethod]
public void IsFileNameCreated(IDataSource<string> sqlDAO)
{
// Arrange
string foldPath = @"C:\HobbyArchive";
string fileName = DateTime.Now.ToString("M_d_yyyy") + "_archive.csv";
string expectedFilePath = System.IO.Path.Combine(foldPath, fileName);
ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
// Act
string actualFilePath = archiveManager.CreateOutFileName();
// Assert
bool result = String.Equals(actualFilePath, expectedFilePath);
if (result)
{
Console.WriteLine("Expected: {0}, Actual: {1}. File name created correctly", expectedFilePath, actualFilePath);
}
else
{
Console.WriteLine("Expected: {0}, Actual: {1}. File name created incorrectly", expectedFilePath, actualFilePath);
}
}
// [Test Method]
public void IsCSVFileExist(IDataSource<string> sqlDAO)
{
// Arrange
ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
SqlDAO sqlDS = null;
string folderPath = @"C:/HobbyArchive";
try
{
bool folderRes = archiveManager.CreateArchiveFolder();
}
catch (Exception ex)
{
Console.WriteLine("Folder creation for copying failed");
}
string filePath = archiveManager.CreateOutFileName();
bool expectedVal = true;
if (sqlDAO.GetType() == typeof(SqlDAO))
{
sqlDS = (SqlDAO)sqlDAO;
}
// Act
bool actualVal = false;
if (sqlDS != null)
{
try
{
actualVal = sqlDS.CopyToFile(filePath);
}
catch (Exception ex)
{
Console.WriteLine("Copying to a file failed !!");
Console.WriteLine(ex.Message);
}
}
// Assert
bool result = File.Exists(filePath);
if (result)
{
Console.WriteLine("Expected: {0}, Actual: {1}. CSV file created correctly", expectedVal, actualVal);
// Clean up the folder use to test.
try
{
Directory.Delete(folderPath, true);
}
catch
{
Console.WriteLine("Folder failed to be deleted");
}
}
else
{
Console.WriteLine("Expected: {0}, Actual: {1}. CSV file created incorrectly", expectedVal, actualVal);
}
}
// [Test Method]
public void IsProcessFlowCompleted(IDataSource<string> sqlDAO)
{
// Arrange
ArchiveManager archive = new ArchiveManager(sqlDAO);
// Act
// Testing archive Manager
int i = -10;
while (i < 20)
{
DateTime date1 = new DateTime(2021, 12, 1, 0, 0, 0);
//Console.WriteLine("Testing first of month: {0}", date1.ToString("dd"));
//string currentDate = DateTime.Now.ToString("dd");
//string currentTime = DateTime.Now.ToString("T");
string currentTime = "00:00:00 AM";
string currentDate = i.ToString();
if (i == 1)
{
currentDate = date1.ToString("dd");
//ArchiveManager archive = new ArchiveManager(sqlDAO);
//archive.Controller();
}
//Console.WriteLine("Current date: {0}, Current Time: {1}", currentDate, currentTime);
Console.WriteLine("Current date: {0}, Current Time: {1}", currentDate, currentTime);
if (String.Equals(currentDate, "01") && String.Equals(currentTime, "00:00:00 AM"))
{
Console.WriteLine("Archiving process Start");
//ArchiveManager archive = new ArchiveManager(sqlDAO);
archive.Controller();
}
i++;
}
}
public void IsCleaningUpCompleted(IDataSource<string> sqlDAO)
{
//Arrange
ArchiveManager archive = new ArchiveManager(sqlDAO);
bool actualVal = false;
bool expectedVal = false;
// Act
actualVal = archive.Controller();
// Assert
//bool result = !(actualVal && expectedVal);
if (expectedVal == actualVal)
{
Console.WriteLine("Expected: {0}, Actual: {1}. Error handle correctly", expectedVal, actualVal);
}
else
{
Console.WriteLine("Expected: {0}, Actual: {1}. Error handle incorrectly", expectedVal, actualVal);
}
}
public void RemoveEntriesTest(IDataSource<string> sqlDAO)
{
Console.WriteLine("TESTING - REMOVE ENTRIES");
// Arrange
ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
SqlDAO sqlDS = null;
if (sqlDAO.GetType() == typeof(SqlDAO))
{
sqlDS = (SqlDAO)sqlDAO;
//sqlDS.GetConnection().Open();
// Act
Console.WriteLine("\nInserting into archive...");
sqlDS.WriteData("INSERT into log(LtimeStamp, LvName, catname, userop, logmessage) values " +
"('2021-08-07 23:00:00', 'Info', 'View', 'create some projects', 'new account created')," +
"('2021-06-04 23:00:00', 'Info', 'Business', 'create some projects', 'new projects made')," +
"('2021-07-02 23:00:00', 'Info', 'View', 'log out', 'log out successful')," +
"('2021-09-03 23:00:00', 'Info', 'Business', 'log in', 'log in successfully')," +
"('2021-10-20 23:00:00', 'Info', 'View', 'search for projects', 'result return')," +
"('2021-09-03 23:00:00', 'Info', 'Business', 'log in', 'log in successfully');");
OdbcDataReader odbcObj = (OdbcDataReader)sqlDS.ReadData("SELECT * FROM log WHERE DATEDIFF(CURRENT_TIMESTAMP, log.LtimeStamp) > 30;");
int count = 0;
while (odbcObj.Read()) { ++count; }
Console.WriteLine("Number of entries > 30 days old: " + count);
Console.WriteLine("\nRemoving entries from archive...");
sqlDS.RemoveEntries();
odbcObj = (OdbcDataReader)sqlDS.ReadData("SELECT * FROM log WHERE DATEDIFF(CURRENT_TIMESTAMP, log.LtimeStamp) > 30;");
count = 0;
while (odbcObj.Read()) { ++count; }
Console.WriteLine("Number of entries > 30 days old: " + count);
// Assert
bool expectedVal = true;
bool actualVal = !Convert.ToBoolean(count);
if (expectedVal == actualVal)
{
Console.WriteLine("\nExpected: {0}, Actual: {0}. Entries removed correctly.", expectedVal, actualVal);
}
else
{
Console.WriteLine("\nExpected: {0}, Actual: {1}. Entries not removed.", expectedVal, actualVal);
}
//sqlDS.GetConnection().Close();
}
return;
}
public void RemoveOutputFileTest(IDataSource<string> sqlDAO)
{
Console.WriteLine("TESTING - REMOVE OUTPUT FILE\n");
// Arrange
ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
SqlDAO sqlDS = null;
if (sqlDAO.GetType() == typeof(SqlDAO))
{
sqlDS = (SqlDAO)sqlDAO;
}
// Act
string filepath = archiveManager.CreateOutFileName();
Console.WriteLine("\nRemoving file...");
sqlDS.RemoveOutputFile(filepath);
// Assert
bool expectedVal = false;
bool actualVal = File.Exists(filepath);
Console.WriteLine("Checking if file exists: " + actualVal);
if (expectedVal == actualVal)
{
Console.WriteLine("\nExpected: {0}, Actual: {0}. Output file removed correctly.", expectedVal, actualVal);
}
else
{
Console.WriteLine("\nExpected: {0}, Actual: {1}. Output file NOT removed.", expectedVal, actualVal);
}
return;
}
public static void Main(string[] args)
{
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
SqlDAO sqlDAO = new SqlDAO(dbInfo);
sqlDAO.GetConnection().Open();
//ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
// Testing folder creation
ArchivingTests test = new ArchivingTests();
test.IsArchiveFolderCreated(sqlDAO);
Console.WriteLine("-----------------");
Console.WriteLine("");
// Testing file creation
test.IsFileNameCreated(sqlDAO);
Console.WriteLine("-----------------");
Console.WriteLine("");
// Testing file creation
test.IsCSVFileExist(sqlDAO);
Console.WriteLine("-----------------");
Console.WriteLine("");
// Testing clean up sequence
//test.IsCleaningUpCompleted(sqlDAO);
//Console.WriteLine("-----------------");
//Console.WriteLine("");
// Testing remove entries
test.RemoveEntriesTest(sqlDAO);
Console.WriteLine("-----------------");
Console.WriteLine("");
// Testing remove output file
test.RemoveOutputFileTest(sqlDAO);
Console.WriteLine("-----------------");
Console.WriteLine("");
sqlDAO.GetConnection().Close();
}
}
}

View File

@ -1,14 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\TeamHobby.HobbyProjectGenerator.Archive\TeamHobby.HobbyProjectGenerator.Archive.csproj" />
</ItemGroup>
</Project>

View File

@ -1,19 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TeamHobby.HobbyProjectGenerator.DAL
{
public interface IRepository<T>
{
bool Create(T model);
T Read();
bool Update(T model);
bool Delete(T model);
}
}

View File

@ -1,50 +0,0 @@
using Microsoft.Data.SqlClient;
using TeamHobby.HobbyProjectGenerator.Models;
namespace TeamHobby.HobbyProjectGenerator.DAL
{
public class SqlDAO
{
public IList<Credentials> GetUserData(string username)
{
// Sql server connection string, needs to be changed accordingly to connect
var connString = "server=localhost;userid=root;password=Plop20;database=users"; // Using @" " makes the string literal
// ADO.NET - ODBC
using (var conn = new SqlConnection(connString))
{
// More complex sql commands are done in this method instead
var sql = "Select * from roles";
using (var command = new SqlCommand(sql, conn))
{
// Get the results from the query
SqlDataReader r = command.ExecuteReader();
// If you wanted to get a singular value back such as a count of a certain item
//command.ExecuteScalar();
// To execute something that doesn't expect results to come back
// Use this method instead, IE. Update command
//command.ExecuteNonQuery();
// Read data from query
while (r.Read())
{
Console.WriteLine(r.ToString());
}
return null;
}
/*// this is meant for specific basic sql commands
using (var adapter = new SqlDataAdapter())
{
adapter.UpdateCommand
adapter.DeleteCommand
adapter.InsertCommand
adapter.SelectCommand
}*/
}
}
}
}

View File

@ -5,7 +5,7 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace TeamHobby.HobbyProjectGenerator.DataAccess namespace TeamHobby.HobbyProjectGenerator.DataAccessLayer
{ {
public interface IDataSource<T> public interface IDataSource<T>
{ {

View File

@ -8,7 +8,7 @@ using System.Threading.Tasks;
using System.IO.Compression; using System.IO.Compression;
using System.Data.Odbc; using System.Data.Odbc;
namespace TeamHobby.HobbyProjectGenerator.DataAccess namespace TeamHobby.HobbyProjectGenerator.DataAccessLayer
{ {
public class SqlDAO : IDataSource<string> public class SqlDAO : IDataSource<string>
{ {

View File

@ -1,6 +1,6 @@
// Print Statements used throughout the program. // Print Statements used throughout the program.
namespace TeamHobby.HobbyProjectGenerator.DataAccess namespace TeamHobby.HobbyProjectGenerator.DataAccessLayer
{ {
public class UiPrint public class UiPrint
{ {

View File

@ -3,9 +3,9 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using TeamHobby.HobbyProjectGenerator.DataAccess; using TeamHobby.HobbyProjectGenerator.DataAccessLayer;
namespace TeamHobby.HobbyProjectGenerator.DataAccess namespace TeamHobby.HobbyProjectGenerator.DataAccessLayer
{ {
public class RDSFactory public class RDSFactory
{ {

View File

@ -1,17 +0,0 @@
/*using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TeamHobby.HobbyProjectGenerator.Logging
{
public interface ILogger
{
bool Log(LogEntry log);
// IList<string> GetAllLogs();
}
}
*/

View File

@ -1,17 +0,0 @@
/*using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TeamHobby.HobbyProjectGenerator.Logging.Contracts
{
public interface ILoggerFactory
{
ILogger CreateLogger()
{
return new DBLogger();
}
}
}
*/

View File

@ -1,16 +0,0 @@
// using System;
// using System.Collections.Generic;
// using System.Linq;
// using System.Text;
// using System.Threading.Tasks;
// namespace TeamHobby.HobbyProjectGenerator.Logging
// {
// public class ConsoleLogger : ILogger
// {
// public bool Log(LogEntry log)
// {
// return true;
// }
// }
// }

View File

@ -1,24 +0,0 @@
/*using System;
namespace TeamHobby.HobbyProjectGenerator.Logging
{
public class DBLogger : ILogger
{
public DBLogger()
{
}
public IList<string> GetAllLogs()
{
throw new NotImplementedException();
}
public bool Log(LogEntry log)
{
throw new NotImplementedException();
}
}
}*/

View File

@ -1,23 +0,0 @@
// using System;
// namespace TeamHobby.HobbyProjectGenerator.Logging
// {
// public class FileLogger : Ilogger
// {
// public FileLogger()
// {
// }
// public IList<string> GetAllLogs()
// {
// throw new NotImplementedException();
// }
// public bool Log(LogEntry log)
// {
// throw new NotImplementedException();
// }
// }
// }

View File

@ -1,58 +0,0 @@
// using System;
// using System.Collections.Generic;
// namespace TeamHobby.HobbyProjectGenerator.Logging
// {
// // implementation of ILogger that stores logs as they initialize
// public class InMemoryLogger : ILogger
// {
// // make readonly to prevent it from being changed somewhere other than in the constructor
// private readonly IList<string> _logStore;
// public InMemoryLogger()
// {
// // list of current logs
// _logStore = new List<string>();
// }
// public InMemoryLogger(IList<string> logStore)
// {
// _logStore = logStore;
// }
// public bool Log(LogEntry entry)
// {
// if (entry is null)
// {
// throw new ArgumentNullException(nameof(entry));
// }
// try
// {
// // string interpolation to add UTC timestamp to log description
// //_logStore.Add($"{DateTime.UtcNow}-> {description}");
// return true;
// }
// catch
// {
// return false;
// }
// }
// public IList<string> GetAllLogs()
// {
// return _logStore;
// }
// public override bool Equals(object? obj)
// {
// return obj is InMemoryLogger logger &&
// EqualityComparer<IList<string>>.Default.Equals(_logStore, logger._logStore);
// }
// public override int GetHashCode()
// {
// return HashCode.Combine(_logStore);
// }
// }
// }

View File

@ -1,53 +0,0 @@
/*using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TeamHobby.HobbyProjectGenerator.Logging
{
public enum LogLevel
{
Info, Debug, Warning, Error
}
public enum LogCategory
{
View, Business, Server, Data, Datastore
}
// LogEntry is a record type with init properties for each field
// ensures that log entries are immutable after initialization
public record LogEntry
{
public LogLevel level { get; init; }
public LogCategory category { get; init; }
public string user { get; init; }
public string description { get; init; }
public DateTime timestamp { get; init; }
// Constructor requireing only the description as an arg
// Assigns default values for LogLevel (Info), LogCategory (Server), user ("System"), and the UTC time at initialization for timestamp
public LogEntry(string description)
{
this.level = LogLevel.Info;
this.category = LogCategory.Server;
this.user = "System";
this.description = description;
this.timestamp = DateTime.UtcNow;
}
// Constructor with args for all fields except timestamp
// timestamp is always set to the UTC time at the time of initialization
public LogEntry(LogLevel level, string user, LogCategory category, string description)
{
this.level = level;
this.category = category;
this.user = user;
this.description = description;
this.timestamp = DateTime.UtcNow;
}
}
}

View File

@ -1,45 +0,0 @@
/*using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TeamHobby.HobbyProjectGenerator.DataAccess;
using TeamHobby.HobbyProjectGenerator.Logging.Contracts;
using TeamHobby.HobbyProjectGenerator.Logging.Implementations;
namespace TeamHobby.HobbyProjectGenerator.Logging
{
internal class LoggingManager
{
private readonly IDataSource<string> _conn;
private readonly ILogger _logger;
private readonly ILoggerFactory _factory;
private readonly LogEntry _logEntry;
// Both Constructors take an IDataSource arg to make logging extensible to future data sources
// first constructor has no additional args - defaults to using the DBFactiry implementation
public LoggingManager(IDataSource<string> dataSource)
{
_conn = dataSource;
_factory = new DBLoggerFactory();
_logger = _factory.CreateLogger();
}
// second constructor takes an additional ILoggerFactory arg - allows for extensible logger types
public LoggingManager(IDataSource<string> dataSource, ILoggerFactory factory)
{
_conn = dataSource;
_factory = factory;
_logger = _factory.CreateLogger();
}
public void Process()
{
_logger.Log(_logEntry);
}
}
}
*/

View File

@ -1,20 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<OutputType>Library</OutputType>
<PlatformTarget>AnyCPU</PlatformTarget>
<Platforms>AnyCPU;x86</Platforms>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<Optimize>True</Optimize>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'">
<Optimize>True</Optimize>
</PropertyGroup>
</Project>

View File

@ -1,15 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Platforms>AnyCPU;x86</Platforms>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\TeamHobby.HobbyProjectGenerator.Archive\TeamHobby.HobbyProjectGenerator.Archive.csproj" />
<ProjectReference Include="..\TeamHobby.HobbyProjectGenerator.DataAccess\TeamHobby.HobbyProjectGenerator.DataAccess.csproj" />
</ItemGroup>
</Project>

View File

@ -4,7 +4,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace TeamHobby.HobbyProjectGenerator.Archive namespace TeamHobby.HobbyProjectGenerator.ServiceLayer
{ {
public interface IRelationArchivable public interface IRelationArchivable
{ {

View File

@ -1,7 +1,7 @@
 
using TeamHobby.HobbyProjectGenerator.DataAccess; using TeamHobby.HobbyProjectGenerator.DataAccessLayer;
namespace TeamHobby.HobbyProjectGenerator.Archive namespace TeamHobby.HobbyProjectGenerator.ServiceLayer
{ {
public class ArchiveManager public class ArchiveManager
{ {

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TeamHobby.HobbyProjectGenerator.Logging.Contracts;
namespace TeamHobby.HobbyProjectGenerator.ServiceLayer
{
public interface ILogger
{
// private IDataSource<string> _datasource = T;
// attempts to connect to the data source provided by the type T
// returns true if the connection is successful
// public bool Connect();
public bool Log(LogEntry Log);
// IList<string> GetAllLogs();
}
}

View File

@ -4,9 +4,13 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace TeamHobby.Main namespace TeamHobby.HobbyProjectGenerator.ServiceLayer.Contracts
{ {
internal class text public interface ILoggerFactory
{ {
ILogger CreateLogger();
} }
} }

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TeamHobby.HobbyProjectGenerator.Logging.Contracts;
namespace TeamHobby.HobbyProjectGenerator.ServiceLayer
{
public class ConsoleLogger : ILogger
{
public bool Log(LogEntry log)
{
return true;
}
}
}

View File

@ -0,0 +1,200 @@
using System;
using System.Data.Odbc;
using TeamHobby.HobbyProjectGenerator.DataAccessLayer;
using TeamHobby.HobbyProjectGenerator.Logging.Contracts;
namespace TeamHobby.HobbyProjectGenerator.ServiceLayer
{
public class DBLogger : ILogger
{
private SqlDAO _datasource;
public DBLogger()
{
}
// SELECT * FROM log
// public IList<LogEntry> GetAllLogs()
// {
// throw new NotImplementedException();
// }
//INSERT INTO log(LvName, catName, userOP, logMessage) VALUES ('Debug','Data', 'SYSTEM', 'testing insert method')
// public bool Connect(SqlDAO logDatabase) {
//
// }
public bool IsActive() {
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=ocalhost;" +
"DATABASE=hbby;" +
"UID=ot;" + // omit password to force SQLException for incorrect passeword
"PASSWORD=wrong" +
"OPTION=3";
// bool isActive = true;
OdbcConnection active = new OdbcConnection(dbInfo);
try {
active.Open();
return false;
}
catch (OdbcException ex) {
// Console.WriteLine(ex.Message);
if (ex.ErrorCode == -2146232009 ) {
//Console.WriteLine(ex.ErrorCode);
Console.WriteLine("Database is active");
return true;
}
else {
Console.WriteLine("Database is inactive");
return false;
}
}
finally {
// Console.WriteLine("closed1");
active.Close();
}
// return false;
}
public bool IsAccessible() {
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
OdbcConnection access = new OdbcConnection(dbInfo);
try {
access.Open();
Console.WriteLine("Database is active and accessible by the system");
return true;
}
catch {
Console.WriteLine("Database is active but inaccessible to the system at this time.");
return false;
}
finally {
access.Close();
}
}
public bool HasCapacity() {
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
OdbcConnection conn = new OdbcConnection(dbInfo);
// get the current capacity of the database in MB using the query:
// SELECT SUM(storage.MB) as CURRENT_CAPACITY_MB FROM (SELECT table_schema as name, ROUND(SUM(data_length + index_length)/1024/1024,1) as MB FROM information_schema.tables GROUP BY table_schema) as storage;
string sqlCurrentCap = $"SELECT SUM(storage.mb) as currentCap FROM (SELECT table_schema as name, ROUND(SUM(data_length + index_length)/1024/1024,1) as mb FROM information_schema.tables GROUP BY table_schema) as storage;";
// get the max capacity in GB; too big to be shown as MB
string sqlMaxCap = $"SELECT SUM(storage.mb) as maxCap FROM (SELECT table_schema as name, ROUND(SUM(max_data_length + max_index_length)/1024,1) as mb FROM information_schema.tables GROUP BY table_schema) as storage;";
// query the data base to get currentCap; the current storage capacity of the system's database (in megabytes)
conn.Open();
OdbcCommand command1 = new OdbcCommand(sqlCurrentCap, conn);
OdbcDataReader result1 = command1.ExecuteReader();
double currentCap = 0;
while (result1.Read()) {
//Console.WriteLine(result1[0].GetType());
//Console.WriteLine("currentCap = {0}", result1[0]);
currentCap = result1.GetDouble(0);
}
// Console.WriteLine(currentCap);
//float currentCap1 = (float) currentCap;
result1.Close();
command1.Dispose();
conn.Close();
// Console.WriteLine("close conn");
// query the data base again to get maxCap; the maximum possible storage capacity of the system's database (in megabytes)
conn.Open();
// Console.WriteLine("open conn");
OdbcCommand command2 = new OdbcCommand(sqlMaxCap, conn);
OdbcDataReader result2 = command2.ExecuteReader();
// Console.WriteLine("open reader 1");
double maxCap = 0;
try {
while (result2.Read()) {
//Console.WriteLine(result2[0].GetType());
maxCap = result2.GetDouble(0);
// Console.WriteLine("maxCap = {0}", result2[0]);
}
// compare currentCap to maxCap
// return true if there is at least 1MB of free space available
// decrement max by 1 MB to allow for any required space from new logs
if ( (currentCap * 1024) < (maxCap - 1024) ) {
// Console.WriteLine(maxCap);
Console.WriteLine("Database has sufficient storage capacity to be written to at this time.\n Current Capacity: {0} MB\n Max Capacity: {1} MB\n", currentCap, maxCap);
}
}
catch {
Console.WriteLine("Insufficient Storage Capacity to log entry to database.\n Current Capacity: {0} MB \n Max Capacity: {1} MB \n", currentCap, maxCap);
return false;
}
finally {
result2.Close();
command2.Dispose();
conn.Close();
}
return false;
}
//Console.WriteLine("close conn 2");
//Console.WriteLine(maxCap);
public bool Log(LogEntry log)
{
log.ShowLog();
//bool status = HasCapacity();
if ( (IsActive() == false || IsAccessible() == false) || (HasCapacity() == false) ) {
return false;
}
else {
// SqlDAO sqlDS = (SqlDAO)_datasource;
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
_datasource = new SqlDAO(dbInfo);
//bool storage = HasCapacity();
try
{
// once connection is confirmed, try inserting the log via SQL statements
string sqlLog = $"INSERT INTO log (Lvname, catName, userOP, logMessage) VALUES ('{log.GetLevel()}','{log.GetCategory()}', " + $"'{log.GetUser()}', '{log.GetDescription()}');";
bool insertNewLog = _datasource.WriteData(sqlLog);
//Console.WriteLine($"Logging Succeeded: The following entry was written to the database: {log}");
// Console.WriteLine(_datasource.ReadData($"SELECT * FROM log;"));
return insertNewLog;
}
// if failed, that means the connection was a sucess but actually writing to the database failed
catch
{
Console.WriteLine("Failed to write log to database; likely due to error in SQL syntax");
return false;
}
}
}
}
}

View File

@ -1,21 +1,21 @@
/*using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using TeamHobby.HobbyProjectGenerator.Logging.Contracts; using TeamHobby.HobbyProjectGenerator.ServiceLayer.Contracts;
namespace TeamHobby.HobbyProjectGenerator.Logging.Implementations namespace TeamHobby.HobbyProjectGenerator.ServiceLayer.Implementations
{ {
public class DBLoggerFactory : ILoggerFactory public class DBLoggerFactory : ILoggerFactory
{ {
public DBLoggerFactory() public DBLoggerFactory()
{ {
//this._logDatabase = logDatabase;
} }
public ILogger CreateLogger()
{ public ILogger CreateLogger() {
return new DBLogger(); return new DBLogger();
} }
} }
} }
*/

View File

@ -0,0 +1,25 @@
using System;
using TeamHobby.HobbyProjectGenerator.Logging.Contracts;
using TeamHobby.HobbyProjectGenerator.ServiceLayer.Contracts;
namespace TeamHobby.HobbyProjectGenerator.ServiceLayer
{
public class FileLogger : ILogger
{
public FileLogger()
{
}
public IList<string> GetAllLogs()
{
throw new NotImplementedException();
}
public bool Log(LogEntry log)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,74 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public enum LogLevel
{
Info, Debug, Warning, Error
}
public enum LogCategory
{
View, Business, Server, Data, Datastore
}
namespace TeamHobby.HobbyProjectGenerator.Logging.Contracts
{
// LogEntry is a record type with init properties for each field
// ensures that log entries are immutable after initialization
// LogEntry is a record type with init properties for each field
// ensures that log entries are immutable after initialization
public record LogEntry
{
private LogLevel _level { get; init; }
private LogCategory _category { get; init; }
private string _user { get; init; }
private string _description { get; init; }
// Constructor with args for all fields except timestamp
// timestamp is always set to the UTC time at the time of initialization
public LogEntry(LogLevel level, LogCategory category, string user, string description)
{
this._level = level;
this._category = category;
this._user = user;
this._description = description;
}
// Constructor requiring only the description as an arg
// Assigns default values for LogLevel (Info), LogCategory (Server), user ("System"), and the UTC time at initialization for timestamp
// public LogEntry(string description)
// {
// this._level = LogLevel.Debug;
// this._category = LogCategory.Server;
// this._user = "SYSTEM";
// this._description = description;
// }
public LogLevel GetLevel() {
return this._level;
}
public LogCategory GetCategory() {
return this._category;
}
public string GetUser() {
return this._user;
}
public string GetDescription() {
return this._description;
}
public void ShowLog() {
Console.WriteLine("Timestamp: {0} | Level: {1}, | Category: {2}, | User: {3}, | Description: '{4}' ", DateTime.Now, this._level.ToString(),this._category.ToString(), this._user, this._description);
}
}
}

View File

@ -0,0 +1,91 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TeamHobby.HobbyProjectGenerator.DataAccessLayer;
using TeamHobby.HobbyProjectGenerator.Logging.Contracts;
using TeamHobby.HobbyProjectGenerator.ServiceLayer.Contracts;
using TeamHobby.HobbyProjectGenerator.ServiceLayer.Implementations;
namespace TeamHobby.HobbyProjectGenerator.ServiceLayer
{
public class LoggingManager
{
// private static IDataSource<string> _datasource;
private ILogger _logger;
private ILoggerFactory _factory;
private LogEntry _logEntry;
// assign default values for LogEntry fields
// these are not readonly because they can be overwritten to specify logging at specific field(s) from the main controller by using the public setters for each field
private LogLevel _level = LogLevel.Debug;
private LogCategory _category = LogCategory.Server;
private string _user = "System";
// Both Constructors take an IDataSource arg to make logging extensible to future data sources
// first constructor has no additional args - defaults to using a DBLoggerFactory to log to database
public LoggingManager()
{
// _datasource = datasource;
_logEntry = new LogEntry(_level, _category, _user, "Logging Manager instantiated");
_factory = new DBLoggerFactory();
_logger = _factory.CreateLogger();
}
// second constructor takes an additional ILoggerFactory arg - allows for extensible logger types
public LoggingManager(ILoggerFactory factory)
{
//_datasource = datasource;
_logEntry = new LogEntry(_level, _category, _user, "Logging Manager instantiated");
_factory = factory;
_logger = _factory.CreateLogger();
}
// // used to create a template entry with the desired fields to write entries at
// public void CreateLog(LogLevel level, LogCategory category, string user, string description) {
// _logEntry = new LogEntry(level,
// category, user, description);
// _logger.Log(_logEntry);
// }
// creates a LogEntry object using a description arg
// uses whateever the current assignments for the other fields ares
public bool CreateLog(string description) {
// creates a LogEntry using the passed in description and current assignements from the necessary fields
_logEntry = new LogEntry(_level, _category, _user, description);
// attempt to log the LogEntry by calling the _logger's Log() method
try {
_logger.Log(_logEntry);
return true;
}
catch {
return false;
}
}
public void Level(LogLevel level) {
this._level = level;
}
public void Category(LogCategory category) {
this._category = category;
}
public void User(string user) {
this._user = user;
}
// public static void Source(IDataSource<string> datasource) {
// _datasource = datasource;
// }
// public static IDataSource<string> GetDataSource() {
// return _datasource;
// }
}
}

View File

@ -7,11 +7,11 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Data.SqlClient" Version="4.0.0" /> <Folder Include="UserManagement\Contracts\" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\TeamHobby.HobbyProjectGenerator.Models\TeamHobby.HobbyProjectGenerator.Models.csproj" /> <ProjectReference Include="..\..\TeamHobby.HobbyProjectGenerator.DataAccessLayer\TeamHobby.HobbyProjectGenerator.DataAccessLayer.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -4,10 +4,10 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Data.Odbc; using System.Data.Odbc;
using TeamHobby.HobbyProjectGenerator.DataAccess; using TeamHobby.HobbyProjectGenerator.DataAccessLayer;
namespace TeamHobby.HobbyProjectGenerator.UserManagement namespace TeamHobby.HobbyProjectGenerator.ServiceLayer
{ {
public class AccountService public class AccountService
{ {
public bool CreateUserRecord(UserAccount newUser, string CreatedBy, IDataSource<string> dbSource) public bool CreateUserRecord(UserAccount newUser, string CreatedBy, IDataSource<string> dbSource)
@ -121,16 +121,16 @@ namespace TeamHobby.HobbyProjectGenerator.UserManagement
return false; return false;
} }
} }
public bool BulkOperation(string signedUser, IDataSource<string> dbSource) public bool BulkOperation(string signedUser, string path, IDataSource<string> dbSource)
{ {
try try
{ {
// Get the current directory. // Get the current directory.
string path = Directory.GetCurrentDirectory(); //string path = Directory.GetCurrentDirectory();
// Open file reader stream // Open file reader stream
using StreamReader fileRead = new(path + "\\BulkOps\\Bulk.txt"); // path + "\\BulkOps\\{input}" using StreamReader fileRead = new(path); // path + + "\\BulkOps\\Bulk.txt"
// Show location of the file being written // Show location of the file being written
Console.WriteLine(path + "\\BulkOps\\Bulk.txt"); //Console.WriteLine(path);
// List choices of operations // List choices of operations
List<string> ops = new List<string> {"Create Account", "Edit Account", List<string> ops = new List<string> {"Create Account", "Edit Account",

View File

@ -4,10 +4,9 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Data.Odbc; using System.Data.Odbc;
using TeamHobby.HobbyProjectGenerator.UserManagement; using TeamHobby.HobbyProjectGenerator.DataAccessLayer;
using TeamHobby.HobbyProjectGenerator.DataAccess;
namespace TeamHobby.HobbyProjectGenerator.UserManagement namespace TeamHobby.HobbyProjectGenerator.ServiceLayer
{ {
public class SystemAccountManager public class SystemAccountManager
{ {
@ -312,8 +311,9 @@ namespace TeamHobby.HobbyProjectGenerator.UserManagement
{ {
// Get name of file and update path to correct folder // Get name of file and update path to correct folder
Console.WriteLine("Please input the name of the file:(Example.txt)"); Console.WriteLine("Please input the name of the file:(Example.txt)");
string filename = $"{path}\\BulkOps\\{Console.ReadLine()}"; string filename = $"{path}\\{Console.ReadLine()}";
//Console.WriteLine(filename)
// Get filesize // Get filesize
long fileSize = filename.Length; long fileSize = filename.Length;
long fileSizeGB = fileSize / (1024 * 1024); long fileSizeGB = fileSize / (1024 * 1024);
@ -334,7 +334,7 @@ namespace TeamHobby.HobbyProjectGenerator.UserManagement
{ {
// Begin bulk operation // Begin bulk operation
Console.WriteLine("Running bulk operation..."); Console.WriteLine("Running bulk operation...");
bool bulkReq = bulkOP.BulkOperation(user.username, dbSource); bool bulkReq = bulkOP.BulkOperation(user.username, filename, dbSource);
if (bulkReq is true) if (bulkReq is true)
{ {
Console.WriteLine("\nBulk operation complete"); Console.WriteLine("\nBulk operation complete");
@ -352,6 +352,7 @@ namespace TeamHobby.HobbyProjectGenerator.UserManagement
break; break;
// View archive // View archive
case 8: case 8:
Console.WriteLine("C:/HobbyArchive");
break; break;
default: default:
Console.WriteLine("Invalid input.\nPlease enter a valid option.\n"); Console.WriteLine("Invalid input.\nPlease enter a valid option.\n");

View File

@ -4,7 +4,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace TeamHobby.HobbyProjectGenerator.UserManagement namespace TeamHobby.HobbyProjectGenerator.ServiceLayer
{ // Class for getting user credentials { // Class for getting user credentials
public class GetCredentials public class GetCredentials
{ {

View File

@ -0,0 +1,378 @@
using System;
using System.Data.Odbc;
using System.Diagnostics;
using System.IO;
using System.Threading;
using TeamHobby.HobbyProjectGenerator.ServiceLayer;
using TeamHobby.HobbyProjectGenerator.DataAccessLayer;
using Xunit;
using Xunit.Abstractions;
namespace TeamHobby.Archiving.xTests
{
public class ArchivingXUnitTest
{
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
ITestOutputHelper output;
public ArchivingXUnitTest(ITestOutputHelper output)
{
this.output = output;
}
[Fact]
public void IsArchiveFolderCreated()
{
// Arrange
SqlDAO sqlDAO = new SqlDAO(dbInfo);
ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
string folderPath = @"C:/HobbyArchive";
bool expectedVal = true;
// Act
archiveManager.CreateArchiveFolder();
// Assert
bool actualVal = Directory.Exists(folderPath);
output.WriteLine("Actual value: {0}, Expected value: {1}", actualVal, expectedVal);
Assert.Equal(expectedVal, actualVal);
// Cleaning up directory after test
output.WriteLine("Cleaning up Folder and File used for testing... ");
try
{
Directory.Delete(folderPath, true);
}
catch
{
Console.WriteLine("Folder failed to be deleted");
}
output.WriteLine("Cleaning up completed. ");
}
[Fact]
public void IsFileNameCreated()
{
// Arrange
SqlDAO sqlDAO = new SqlDAO(dbInfo);
string foldPath = @"C:\HobbyArchive";
string fileName = DateTime.Now.ToString("M_d_yyyy") + "_archive.csv";
string expectedFilePath = System.IO.Path.Combine(foldPath, fileName);
ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
// Act
string actualFilePath = archiveManager.CreateOutFileName();
// Assert
Assert.Equal(expectedFilePath, actualFilePath);
}
[Fact]
public void IsCSVFileExist()
{
// Arrange
SqlDAO sqlDAO = new SqlDAO(dbInfo);
ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
SqlDAO sqlDS = null;
string folderPath = @"C:/HobbyArchive";
try
{
bool folderRes = archiveManager.CreateArchiveFolder();
}
catch (Exception ex)
{
Console.WriteLine("Folder creation for copying failed");
}
string filePath = archiveManager.CreateOutFileName();
bool expectedVal = true;
if (sqlDAO.GetType() == typeof(SqlDAO))
{
sqlDS = (SqlDAO)sqlDAO;
}
// Act
if (sqlDS != null)
{
try
{
sqlDS.CopyToFile(filePath);
}
catch (Exception ex)
{
Console.WriteLine("Copying to a file failed !!");
Console.WriteLine(ex.Message);
}
}
// Assert
bool actualVal = File.Exists(filePath);
output.WriteLine("Actual value: {0}, Expected value: {1}", actualVal, expectedVal);
Assert.Equal(expectedVal, actualVal);
output.WriteLine("Cleaning up Folder and File used for testing... ");
try
{
Directory.Delete(folderPath, true);
}
catch
{
Console.WriteLine("Folder failed to be deleted");
}
output.WriteLine("Cleaning up completed. ");
}
[Fact]
public void IsEntriesRemoved()
{
// Arrange
SqlDAO sqlDAO = new SqlDAO(dbInfo);
ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
OdbcDataReader odbcObj = null;
Object resultData = null;
bool expectedVal = false;
sqlDAO.WriteData("INSERT into log(LtimeStamp, LvName, catname, userop, logmessage) values" +
"('2021-08-07 23:00:00', 'Info', 'View', 'create some projects', 'new account created')," +
"('2021-06-04 23:00:00', 'Info', 'Business', 'create some projects', 'new projects made')," +
"('2021-07-02 23:00:00', 'Info', 'View', 'log out', 'log out successful')," +
"('2021-09-03 23:00:00', 'Info', 'Business', 'log in', 'log in successfully')," +
"('2021-10-20 23:00:00', 'Info', 'View', 'search for projects', 'result return');");
// Act
sqlDAO.RemoveEntries();
// Assert
bool actualVal;
resultData = sqlDAO.ReadData("SELECT * FROM log WHERE DATEDIFF(CURRENT_TIMESTAMP, log.LtimeStamp) > 30;");
if ((resultData != null) && (resultData.GetType() == typeof(OdbcDataReader)))
{
odbcObj = (OdbcDataReader)resultData;
}
OdbcConnection conn = sqlDAO.GetConnection();
actualVal = odbcObj.HasRows;
conn.Close();
output.WriteLine("Actual value: {0}, Expected value: {1}", actualVal, expectedVal);
Assert.Equal(expectedVal, actualVal);
}
[Fact]
public void IsOutputFileRemoved()
{
// Arrange
SqlDAO sqlDAO = new SqlDAO(dbInfo);
ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
bool expectedVal = false;
//Thread.Sleep(5000);
// Create the folder and the csv file for compressing
archiveManager.CreateArchiveFolder();
string filepath = archiveManager.CreateOutFileName();
sqlDAO.CopyToFile(filepath);
// Act
if (sqlDAO != null)
{
sqlDAO.RemoveOutputFile(filepath);
}
// Assert
bool actualVal = File.Exists(filepath);
Assert.Equal(expectedVal, actualVal);
}
[Fact]
public void IsFileCompressed()
{
// Arrange
SqlDAO sqlDAO = new SqlDAO(dbInfo);
ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
// Create the folder and the csv file to be compressed.
archiveManager.CreateArchiveFolder();
string filePath = archiveManager.CreateOutFileName();
sqlDAO.CopyToFile(filePath);
FileAttributes expectedAttribute = FileAttributes.Archive;
string compFilePath = Path.ChangeExtension(filePath, ".gz");
// Act
sqlDAO.CompressFile(filePath);
// Assert
FileAttributes actualAttribute = File.GetAttributes(compFilePath);
output.WriteLine("Actual value: {0}, Expected value: {1}", actualAttribute, expectedAttribute);
Assert.Equal(expectedAttribute, actualAttribute);
}
[Fact]
public void IsArchive_Under_60s_10kRecords()
{
// Arrange
SqlDAO sqlDAO = new SqlDAO(dbInfo);
ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
var timer = new Stopwatch();
double expectedVal = 60;
string folderPath = @"C:/HobbyArchive";
sqlDAO.WriteData("INSERT into log(LtimeStamp, LvName, catname, userop, logmessage) values" +
"('2021-08-07 23:00:00', 'Info', 'View', 'create some projects', 'new account created')," +
"('2021-06-04 23:00:00', 'Info', 'Business', 'create some projects', 'new projects made')," +
"('2021-07-02 23:00:00', 'Info', 'View', 'log out', 'log out successful')," +
"('2021-09-03 23:00:00', 'Info', 'Business', 'log in', 'log in successfully')," +
"('2021-10-20 23:00:00', 'Info', 'View', 'search for projects', 'result return');");
for (int i = 0; i <= 11; i++)
{
sqlDAO.WriteData("INSERT INTO log(LtimeStamp, LvName, catName, userOP, logMessage) " +
"SELECT LtimeStamp, LvName, catName, userOP, logMessage FROM log WHERE DATEDIFF(CURRENT_TIMESTAMP, log.LtimeStamp) > 30;");
}
// Act
timer.Start();
archiveManager.Controller();
timer.Stop();
// Assert
var actualVal = timer.Elapsed.Seconds;
output.WriteLine("Actual value: {0}s, Expected value: {1}s", actualVal, expectedVal);
Assert.True(actualVal < expectedVal);
// Clean up resources after testing
output.WriteLine("Cleaning up Folder and File used for testing... ");
try
{
Directory.Delete(folderPath, true);
}
catch
{
Console.WriteLine("Folder failed to be deleted");
}
output.WriteLine("Cleaning up completed... ");
}
[Fact]
public void IsArchive_Under_60s_1mRecords()
{
// Arrange
SqlDAO sqlDAO = new SqlDAO(dbInfo);
ArchiveManager archiveManager = new ArchiveManager(sqlDAO);
var timer = new Stopwatch();
double expectedVal = 60;
string folderPath = @"C:/HobbyArchive";
sqlDAO.WriteData("INSERT into log(LtimeStamp, LvName, catname, userop, logmessage) values" +
"('2021-08-07 23:00:00', 'Info', 'View', 'create some projects', 'new account created')," +
"('2021-06-04 23:00:00', 'Info', 'Business', 'create some projects', 'new projects made')," +
"('2021-07-02 23:00:00', 'Info', 'View', 'log out', 'log out successful')," +
"('2021-09-03 23:00:00', 'Info', 'Business', 'log in', 'log in successfully')," +
"('2021-10-20 23:00:00', 'Info', 'View', 'search for projects', 'result return');");
for (int i = 0; i <= 18; i++)
{
sqlDAO.WriteData("INSERT INTO log(LtimeStamp, LvName, catName, userOP, logMessage) " +
"SELECT LtimeStamp, LvName, catName, userOP, logMessage FROM log WHERE DATEDIFF(CURRENT_TIMESTAMP, log.LtimeStamp) > 30;");
}
// Act
timer.Start();
archiveManager.Controller();
timer.Stop();
// Arrange
double actualVal = timer.Elapsed.Seconds;
output.WriteLine("Actual value: {0}s, Expected value: {1}s", actualVal, expectedVal);
Assert.True(actualVal < expectedVal);
output.WriteLine("Cleaning up Folder and File used for testing... ");
//Clean up resources after testing
try
{
Directory.Delete(folderPath, true);
}
catch
{
Console.WriteLine("Folder failed to be deleted");
}
output.WriteLine("Cleaning up completed... ");
}
[Fact]
// [Test Method]
public void IsProcessFlowCompleted()
{
// Arrange
SqlDAO sqlDAO = new SqlDAO(dbInfo);
ArchiveManager archive = new ArchiveManager(sqlDAO);
bool expectedVal = true;
bool actualVal = false;
string folderPath = @"C:/HobbyArchive";
// Adding 10000 records to database for testing
sqlDAO.WriteData("INSERT into log(LtimeStamp, LvName, catname, userop, logmessage) values" +
"('2021-08-07 23:00:00', 'Info', 'View', 'create some projects', 'new account created')," +
"('2021-06-04 23:00:00', 'Info', 'Business', 'create some projects', 'new projects made')," +
"('2021-07-02 23:00:00', 'Info', 'View', 'log out', 'log out successful')," +
"('2021-09-03 23:00:00', 'Info', 'Business', 'log in', 'log in successfully')," +
"('2021-10-20 23:00:00', 'Info', 'View', 'search for projects', 'result return');");
for (int j = 0; j <= 11; j++)
{
sqlDAO.WriteData("INSERT INTO log(LtimeStamp, LvName, catName, userOP, logMessage) " +
"SELECT LtimeStamp, LvName, catName, userOP, logMessage FROM log WHERE DATEDIFF(CURRENT_TIMESTAMP, log.LtimeStamp) > 30;");
}
// Act
// Testing archive Manager
int i = -10;
while (i < 20)
{
DateTime date1 = new DateTime(2021, 12, 1, 0, 0, 0);
string currentTime = "00:00:00 AM";
string currentDate = i.ToString();
if (i == 1)
{
currentDate = date1.ToString("dd");
}
//Console.WriteLine("Current date: {0}, Current Time: {1}", currentDate, currentTime);
Console.WriteLine("Current date: {0}, Current Time: {1}", currentDate, currentTime);
if (String.Equals(currentDate, "01") && String.Equals(currentTime, "00:00:00 AM"))
{
Console.WriteLine("Archiving process Start");
actualVal = archive.Controller();
}
i++;
}
// Assert
output.WriteLine("Actual value: {0}, Expected value: {1}", actualVal, expectedVal);
Assert.Equal(expectedVal, actualVal);
output.WriteLine("Cleaning up Folder and File used for testing... ");
try
{
Directory.Delete(folderPath, true);
}
catch
{
Console.WriteLine("Folder failed to be deleted");
}
output.WriteLine("Cleaning up completed... ");
}
}
}

View File

@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\main\TeamHobby.HobbyProjectGenerator.Main.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,264 @@
using System;
using Xunit;
using Xunit.Abstractions;
using System.Threading;
using TeamHobby.HobbyProjectGenerator.ServiceLayer;
using TeamHobby.HobbyProjectGenerator.DataAccessLayer;
using System.IO;
namespace TeamHobby.UserManagement.xTests
{
public class UseerManagementTests
{
ITestOutputHelper output;
public UseerManagementTests(ITestOutputHelper output)
{
this.output = output;
}
// User is able to perform any single UM operation within 5 seconds upon invocation.A system message displays “UM operation was successful”
[Fact]
public void SingleOperationinFiveSec()
{
// Arrange
DateTime sTime = DateTime.Now;
var TestAcc = new UserAccount("newUser", "4567", "email@a.com", "regular", sTime);
var serviceTest = new AccountService();
string dbType = "sql";
RDSFactory dbFactory = new RDSFactory();
// Testing Data Access Layer
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo);
// Act
// Create a file
serviceTest.CreateUserRecord(TestAcc, "Rifat", datasource);
DateTime eTime = DateTime.Now;
TimeSpan timeDiff = (eTime - sTime);
var sec = timeDiff.TotalSeconds;
// Assert
if (sec > 5)
{
output.WriteLine("Single Operation was unsuccessful");
Assert.True(false);
}
else
{
Assert.True(true);
output.WriteLine("Single Operation was successful");
}
}
// Single UM operation takes longer than 5 seconds
[Fact]
public void FailSingleOperationinFiveSec()
{
// Arrange
DateTime sTime = DateTime.Now;
var TestAcc = new UserAccount("newUser", "4567", "email@a.com", "regular", sTime);
var serviceTest = new AccountService();
string dbType = "sql";
RDSFactory dbFactory = new RDSFactory();
// Testing Data Access Layer
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo);
// Act
// Create a file
serviceTest.CreateUserRecord(TestAcc, "Rifat", datasource);
Thread.Sleep(6000);
DateTime eTime = DateTime.Now;
TimeSpan timeDiff = (eTime - sTime);
var sec = timeDiff.TotalSeconds;
// Assert
if (sec > 5)
{
output.WriteLine("Single Operation was unsuccessful");
Assert.False(false);
}
else
{
Assert.True(false);
output.WriteLine("Single Operation was successful");
}
}
// Single UM operation completes within 5 seconds, but no system message is shown or inaccurate system message is shown
[Fact]
public void SingleOperationwithMessage()
{
// Arrange
DateTime sTime = DateTime.Now;
var TestAcc = new UserAccount("newUserMessage", "4567", "email@a.com", "regular", sTime);
var serviceTest = new AccountService();
string dbType = "sql";
RDSFactory dbFactory = new RDSFactory();
var checkMess = false;
// Testing Data Access Layer
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo);
// Act
// Create a file
serviceTest.CreateUserRecord(TestAcc, "Rifat", datasource);
DateTime eTime = DateTime.Now;
TimeSpan timeDiff = (eTime - sTime);
var sec = timeDiff.TotalSeconds;
// Assert
if (sec > 5)
{
var message = "Single Operation was unsuccessful";
Assert.False(true);
output.WriteLine(message);
if (checkMess)
{
Assert.False(true);
throw new Exception("Message was not printed");
}
}
else
{
Assert.True(true);
var message2 = "Single Operation was successful";
output.WriteLine(message2);
if (!checkMess)
{
output.WriteLine("Message was printed");
Assert.True(true);
}
}
}
// Bulk UM operations completes within 60 seconds, but no system message is shown or inaccurate system message is shown
[Fact]
public void BulkOperationwithMessage()
{
// Arrange
DateTime sTime = DateTime.Now;
var checkMess = false;
var serviceTest = new AccountService();
string dbType = "sql";
RDSFactory dbFactory = new RDSFactory();
string path = Directory.GetCurrentDirectory();
// Testing Data Access Layer
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo);
// Act
// Create a file
//for (int i = 0; i < 10000; i++)
//{
//var TestAcc = new UserAccount("newUser" + $"{i}", "4567", $"email{i}@a.com", "regular", sTime);
serviceTest.BulkOperation("Rifat", path + "\\Bulk.txt", datasource);
//}
DateTime eTime = DateTime.Now;
TimeSpan timeDiff = (eTime - sTime);
var sec = timeDiff.TotalSeconds;
// Assert
if (sec > 60)
{
var message = "Bulk Operation was unsuccessful";
Assert.True(false);
output.WriteLine(message);
if (checkMess)
{
Assert.True(false);
throw new Exception("Message was not printed");
}
}
else
{
Assert.True(true);
var message2 = "Bulk Operation was successful";
output.WriteLine(message2);
if (!checkMess)
{
output.WriteLine("Message was printed");
Assert.True(true);
}
}
}
// User is able to perform less than 10K UM operations in bulk within 60 seconds. A system message displays “Bulk UM operation was successful”
[Fact]
public void BulkOperationforSixty()
{
// Arrange
DateTime sTime = DateTime.Now;
var serviceTest = new AccountService();
string dbType = "sql";
RDSFactory dbFactory = new RDSFactory();
string dir = Directory.GetCurrentDirectory();
string path = dir + "\\Bulk.txt";
output.WriteLine(path);
// Testing Data Access Layer
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo);
// Act
// Create a file
//for (int i = 0; i < 10000; i++)
//{
//var TestAcc = new UserAccount("newUser" + $"{i}", "4567", $"email{i}@a.com", "regular", sTime);
serviceTest.BulkOperation("Rifat", path, datasource);
//}
DateTime eTime = DateTime.Now;
TimeSpan timeDiff = (eTime - sTime);
var sec = timeDiff.TotalSeconds;
// Assert
if (sec > 60)
{
output.WriteLine("Bulk Operation was unsuccessful");
Assert.True(false);
}
else
{
Assert.True(true);
output.WriteLine("Bulk Operation was successful");
}
}
}
}

View File

@ -0,0 +1,7 @@
namespace TeamHobby.HobbyProjectGenerator.View
{
public class Class1
{
}
}

View File

@ -0,0 +1,7 @@
namespace TeamHobby.HobbyProjectGenerator.ViewModel
{
public class Class1
{
}
}

View File

@ -6,8 +6,4 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\TeamHobby.HobbyProjectGenerator.DataAccess\TeamHobby.HobbyProjectGenerator.DataAccess.csproj" />
</ItemGroup>
</Project> </Project>

View File

@ -3,80 +3,79 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 17
VisualStudioVersion = 17.0.31919.166 VisualStudioVersion = 17.0.31919.166
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamHobby.UserManagement.Tests", "..\TeamHobby.UserManagement.Tests\TeamHobby.UserManagement.Tests.csproj", "{5C5A44B4-EC3C-44F2-8F39-F917F8ED932F}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamHobby.HobbyProjectGenerator.Main", "..\main\TeamHobby.HobbyProjectGenerator.Main.csproj", "{30C7EBF3-3957-46E5-86C1-C13356841ECA}"
ProjectSection(ProjectDependencies) = postProject
{AA48A66C-FA36-4AF9-A782-CEC22838EB8F} = {AA48A66C-FA36-4AF9-A782-CEC22838EB8F}
{2E7193B8-86B6-48DA-9671-CD84615A5F5D} = {2E7193B8-86B6-48DA-9671-CD84615A5F5D}
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamHobby.HobbyProjectGenerator.Models", "..\TeamHobby.HobbyProjectGenerator.Models\TeamHobby.HobbyProjectGenerator.Models.csproj", "{75DED6C2-D404-4E71-A58B-0F616DB5C062}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "main", "..\main\main.csproj", "{30C7EBF3-3957-46E5-86C1-C13356841ECA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamHobby.HobbyProjectGenerator.Archive", "..\TeamHobby.HobbyProjectGenerator.Archive\TeamHobby.HobbyProjectGenerator.Archive.csproj", "{B88ED0D9-72E2-4245-BD8F-856FF42E500C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamHobby.HobbyProjectGenerator.DataAccess", "..\TeamHobby.HobbyProjectGenerator.DataAccess\TeamHobby.HobbyProjectGenerator.DataAccess.csproj", "{AA48A66C-FA36-4AF9-A782-CEC22838EB8F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamHobby.HobbyProjectGenerator.UserManagement", "..\TeamHobby.HobbyProjectGenerator.UserManagement\TeamHobby.HobbyProjectGenerator.UserManagement.csproj", "{2E7193B8-86B6-48DA-9671-CD84615A5F5D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamHobby.HobbyProjectGenerator.Logging.Tests", "..\TeamHobby.HobbyProjectGenerator.Logging.Tests\TeamHobby.HobbyProjectGenerator.Logging.Tests.csproj", "{CA8D11CF-807C-4C90-A529-0371F73518F6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamHobby.HobbyProjectGenerator.ArchiveTests", "..\TeamHobby.HobbyProjectGenerator.ArchiveTests\TeamHobby.HobbyProjectGenerator.ArchiveTests.csproj", "{C5EBD1F8-C806-4BF9-B2D7-8876072630FD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamHobby.UserManagement.xTests", "TeamHobby.UserManagement.xTests\TeamHobby.UserManagement.xTests.csproj", "{6D575AF1-C138-44C5-B701-5AEC4ACEAA7A}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D29D9225-3748-4067-AF07-E677A525EF39}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D29D9225-3748-4067-AF07-E677A525EF39}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
TeamHobby.HobbyProjectGenerator.csproj = TeamHobby.HobbyProjectGenerator.csproj TeamHobby.HobbyProjectGenerator.csproj = TeamHobby.HobbyProjectGenerator.csproj
EndProjectSection EndProjectSection
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TeamHobby.Archiving.xTests", "TeamHobby.Archiving.xTests\TeamHobby.Archiving.xTests.csproj", "{8C039F49-13D3-4AEE-A1C3-A880751852BB}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamHobby.HobbyProjectGenerator.Tests", "TeamHobby.HobbyProjectGenerator.Tests\TeamHobby.HobbyProjectGenerator.Tests.csproj", "{2E9DC0A0-D9A1-40A5-9684-ECC8EDCD8DAD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamHobby.HobbyProjectGenerator.ServiceLayer", "TeamHobby.HobbyProjectGenerator.ServiceLayer\TeamHobby.HobbyProjectGenerator.ServiceLayer.csproj", "{EF90CC6C-0C44-4E39-AAB6-96F9F34F0784}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TeamHobby.HobbyProjectGenerator.DataAccessLayer", "..\TeamHobby.HobbyProjectGenerator.DataAccessLayer\TeamHobby.HobbyProjectGenerator.DataAccessLayer.csproj", "{6DBAC411-AC0E-4129-AE57-C8D1DA1DF9B2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TeamHobby.HobbyProjectGenerator.ViewModel", "TeamHobby.HobbyProjectGenerator.ViewModel\TeamHobby.HobbyProjectGenerator.ViewModel.csproj", "{092F7372-3CBA-49A2-A7A8-EC3FF97E3082}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TeamHobby.HobbyProjectGenerator.View", "TeamHobby.HobbyProjectGenerator.View\TeamHobby.HobbyProjectGenerator.View.csproj", "{2E401E9D-731B-425D-B0BD-FF1E72D5D23C}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{5C5A44B4-EC3C-44F2-8F39-F917F8ED932F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5C5A44B4-EC3C-44F2-8F39-F917F8ED932F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5C5A44B4-EC3C-44F2-8F39-F917F8ED932F}.Release|Any CPU.Build.0 = Release|Any CPU
{75DED6C2-D404-4E71-A58B-0F616DB5C062}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{75DED6C2-D404-4E71-A58B-0F616DB5C062}.Debug|Any CPU.Build.0 = Debug|Any CPU
{75DED6C2-D404-4E71-A58B-0F616DB5C062}.Release|Any CPU.ActiveCfg = Release|Any CPU
{75DED6C2-D404-4E71-A58B-0F616DB5C062}.Release|Any CPU.Build.0 = Release|Any CPU
{30C7EBF3-3957-46E5-86C1-C13356841ECA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {30C7EBF3-3957-46E5-86C1-C13356841ECA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{30C7EBF3-3957-46E5-86C1-C13356841ECA}.Debug|Any CPU.Build.0 = Debug|Any CPU {30C7EBF3-3957-46E5-86C1-C13356841ECA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{30C7EBF3-3957-46E5-86C1-C13356841ECA}.Debug|x86.ActiveCfg = Debug|Any CPU
{30C7EBF3-3957-46E5-86C1-C13356841ECA}.Debug|x86.Build.0 = Debug|Any CPU
{30C7EBF3-3957-46E5-86C1-C13356841ECA}.Release|Any CPU.ActiveCfg = Release|Any CPU {30C7EBF3-3957-46E5-86C1-C13356841ECA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{30C7EBF3-3957-46E5-86C1-C13356841ECA}.Release|Any CPU.Build.0 = Release|Any CPU {30C7EBF3-3957-46E5-86C1-C13356841ECA}.Release|Any CPU.Build.0 = Release|Any CPU
{B88ED0D9-72E2-4245-BD8F-856FF42E500C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {30C7EBF3-3957-46E5-86C1-C13356841ECA}.Release|x86.ActiveCfg = Release|Any CPU
{B88ED0D9-72E2-4245-BD8F-856FF42E500C}.Debug|Any CPU.Build.0 = Debug|Any CPU {30C7EBF3-3957-46E5-86C1-C13356841ECA}.Release|x86.Build.0 = Release|Any CPU
{B88ED0D9-72E2-4245-BD8F-856FF42E500C}.Release|Any CPU.ActiveCfg = Release|Any CPU {2E9DC0A0-D9A1-40A5-9684-ECC8EDCD8DAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B88ED0D9-72E2-4245-BD8F-856FF42E500C}.Release|Any CPU.Build.0 = Release|Any CPU {2E9DC0A0-D9A1-40A5-9684-ECC8EDCD8DAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AA48A66C-FA36-4AF9-A782-CEC22838EB8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E9DC0A0-D9A1-40A5-9684-ECC8EDCD8DAD}.Debug|x86.ActiveCfg = Debug|Any CPU
{AA48A66C-FA36-4AF9-A782-CEC22838EB8F}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E9DC0A0-D9A1-40A5-9684-ECC8EDCD8DAD}.Debug|x86.Build.0 = Debug|Any CPU
{AA48A66C-FA36-4AF9-A782-CEC22838EB8F}.Release|Any CPU.ActiveCfg = Release|Any CPU {2E9DC0A0-D9A1-40A5-9684-ECC8EDCD8DAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AA48A66C-FA36-4AF9-A782-CEC22838EB8F}.Release|Any CPU.Build.0 = Release|Any CPU {2E9DC0A0-D9A1-40A5-9684-ECC8EDCD8DAD}.Release|Any CPU.Build.0 = Release|Any CPU
{2E7193B8-86B6-48DA-9671-CD84615A5F5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E9DC0A0-D9A1-40A5-9684-ECC8EDCD8DAD}.Release|x86.ActiveCfg = Release|Any CPU
{2E7193B8-86B6-48DA-9671-CD84615A5F5D}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E9DC0A0-D9A1-40A5-9684-ECC8EDCD8DAD}.Release|x86.Build.0 = Release|Any CPU
{2E7193B8-86B6-48DA-9671-CD84615A5F5D}.Release|Any CPU.ActiveCfg = Release|Any CPU {EF90CC6C-0C44-4E39-AAB6-96F9F34F0784}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2E7193B8-86B6-48DA-9671-CD84615A5F5D}.Release|Any CPU.Build.0 = Release|Any CPU {EF90CC6C-0C44-4E39-AAB6-96F9F34F0784}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CA8D11CF-807C-4C90-A529-0371F73518F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EF90CC6C-0C44-4E39-AAB6-96F9F34F0784}.Debug|x86.ActiveCfg = Debug|Any CPU
{CA8D11CF-807C-4C90-A529-0371F73518F6}.Debug|Any CPU.Build.0 = Debug|Any CPU {EF90CC6C-0C44-4E39-AAB6-96F9F34F0784}.Debug|x86.Build.0 = Debug|Any CPU
{CA8D11CF-807C-4C90-A529-0371F73518F6}.Release|Any CPU.ActiveCfg = Release|Any CPU {EF90CC6C-0C44-4E39-AAB6-96F9F34F0784}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CA8D11CF-807C-4C90-A529-0371F73518F6}.Release|Any CPU.Build.0 = Release|Any CPU {EF90CC6C-0C44-4E39-AAB6-96F9F34F0784}.Release|Any CPU.Build.0 = Release|Any CPU
{C5EBD1F8-C806-4BF9-B2D7-8876072630FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EF90CC6C-0C44-4E39-AAB6-96F9F34F0784}.Release|x86.ActiveCfg = Release|Any CPU
{C5EBD1F8-C806-4BF9-B2D7-8876072630FD}.Debug|Any CPU.Build.0 = Debug|Any CPU {EF90CC6C-0C44-4E39-AAB6-96F9F34F0784}.Release|x86.Build.0 = Release|Any CPU
{C5EBD1F8-C806-4BF9-B2D7-8876072630FD}.Release|Any CPU.ActiveCfg = Release|Any CPU {6DBAC411-AC0E-4129-AE57-C8D1DA1DF9B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C5EBD1F8-C806-4BF9-B2D7-8876072630FD}.Release|Any CPU.Build.0 = Release|Any CPU {6DBAC411-AC0E-4129-AE57-C8D1DA1DF9B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6D575AF1-C138-44C5-B701-5AEC4ACEAA7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6DBAC411-AC0E-4129-AE57-C8D1DA1DF9B2}.Debug|x86.ActiveCfg = Debug|Any CPU
{6D575AF1-C138-44C5-B701-5AEC4ACEAA7A}.Debug|Any CPU.Build.0 = Debug|Any CPU {6DBAC411-AC0E-4129-AE57-C8D1DA1DF9B2}.Debug|x86.Build.0 = Debug|Any CPU
{6D575AF1-C138-44C5-B701-5AEC4ACEAA7A}.Release|Any CPU.ActiveCfg = Release|Any CPU {6DBAC411-AC0E-4129-AE57-C8D1DA1DF9B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6D575AF1-C138-44C5-B701-5AEC4ACEAA7A}.Release|Any CPU.Build.0 = Release|Any CPU {6DBAC411-AC0E-4129-AE57-C8D1DA1DF9B2}.Release|Any CPU.Build.0 = Release|Any CPU
{8C039F49-13D3-4AEE-A1C3-A880751852BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6DBAC411-AC0E-4129-AE57-C8D1DA1DF9B2}.Release|x86.ActiveCfg = Release|Any CPU
{8C039F49-13D3-4AEE-A1C3-A880751852BB}.Debug|Any CPU.Build.0 = Debug|Any CPU {6DBAC411-AC0E-4129-AE57-C8D1DA1DF9B2}.Release|x86.Build.0 = Release|Any CPU
{8C039F49-13D3-4AEE-A1C3-A880751852BB}.Release|Any CPU.ActiveCfg = Release|Any CPU {092F7372-3CBA-49A2-A7A8-EC3FF97E3082}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8C039F49-13D3-4AEE-A1C3-A880751852BB}.Release|Any CPU.Build.0 = Release|Any CPU {092F7372-3CBA-49A2-A7A8-EC3FF97E3082}.Debug|Any CPU.Build.0 = Debug|Any CPU
{092F7372-3CBA-49A2-A7A8-EC3FF97E3082}.Debug|x86.ActiveCfg = Debug|Any CPU
{092F7372-3CBA-49A2-A7A8-EC3FF97E3082}.Debug|x86.Build.0 = Debug|Any CPU
{092F7372-3CBA-49A2-A7A8-EC3FF97E3082}.Release|Any CPU.ActiveCfg = Release|Any CPU
{092F7372-3CBA-49A2-A7A8-EC3FF97E3082}.Release|Any CPU.Build.0 = Release|Any CPU
{092F7372-3CBA-49A2-A7A8-EC3FF97E3082}.Release|x86.ActiveCfg = Release|Any CPU
{092F7372-3CBA-49A2-A7A8-EC3FF97E3082}.Release|x86.Build.0 = Release|Any CPU
{2E401E9D-731B-425D-B0BD-FF1E72D5D23C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2E401E9D-731B-425D-B0BD-FF1E72D5D23C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2E401E9D-731B-425D-B0BD-FF1E72D5D23C}.Debug|x86.ActiveCfg = Debug|Any CPU
{2E401E9D-731B-425D-B0BD-FF1E72D5D23C}.Debug|x86.Build.0 = Debug|Any CPU
{2E401E9D-731B-425D-B0BD-FF1E72D5D23C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2E401E9D-731B-425D-B0BD-FF1E72D5D23C}.Release|Any CPU.Build.0 = Release|Any CPU
{2E401E9D-731B-425D-B0BD-FF1E72D5D23C}.Release|x86.ActiveCfg = Release|Any CPU
{2E401E9D-731B-425D-B0BD-FF1E72D5D23C}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -1,105 +0,0 @@
using System;
using Xunit;
using Xunit.Abstractions;
using System.Threading;
using TeamHobby.HobbyProjectGenerator.UserManagement;
using TeamHobby.HobbyProjectGenerator.DataAccess;
namespace TeamHobby.UserManagement.xTests
{
public class UnitTest1
{
ITestOutputHelper output;
public UnitTest1(ITestOutputHelper output)
{
this.output = output;
}
[Fact]
public void SingleOperationinFiveSec()
{
// Arrange
DateTime sTime = DateTime.Now;
var TestAcc = new UserAccount("newUser", "4567", "email@a.com", "regular", sTime);
var serviceTest = new AccountService();
string dbType = "sql";
RDSFactory dbFactory = new RDSFactory();
// Testing Data Access Layer
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo);
// Act
// Create a file
serviceTest.CreateUserRecord(TestAcc, "Rifat", datasource);
DateTime eTime = DateTime.Now;
TimeSpan timeDiff = (eTime - sTime);
var sec = timeDiff.TotalSeconds;
// Assert
if (sec > 5)
{
output.WriteLine("Single Operation was unsuccessful");
Assert.False(true);
}
else
{
Assert.True(true);
output.WriteLine("Single Operation was successful");
}
}
[Fact]
public void BulkOperationforSixty()
{
// Arrange
DateTime sTime = DateTime.Now;
var serviceTest = new AccountService();
string dbType = "sql";
RDSFactory dbFactory = new RDSFactory();
// Testing Data Access Layer
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo);
// Act
// Create a file
for (int i = 0; i < 10000; i++)
{
var TestAcc = new UserAccount("newUser" + $"{i}", "4567", $"email{i}@a.com", "regular", sTime);
serviceTest.DeleteUserRecord(TestAcc, "Rifat", datasource);
}
DateTime eTime = DateTime.Now;
TimeSpan timeDiff = (eTime - sTime);
var sec = timeDiff.TotalSeconds;
// Assert
if (sec > 60)
{
output.WriteLine("Bulk Operation was unsuccessful");
Assert.False(true);
}
else
{
Assert.True(true);
output.WriteLine("Bulk Operation was successful");
}
}
}
}

View File

@ -0,0 +1,264 @@
using System;
using Xunit;
using Xunit.Abstractions;
using System.Threading;
using TeamHobby.HobbyProjectGenerator.UserManagement;
using TeamHobby.HobbyProjectGenerator.DataAccess;
using System.IO;
namespace TeamHobby.UserManagement.xTests
{
public class UseerManagementTests
{
ITestOutputHelper output;
public UseerManagementTests(ITestOutputHelper output)
{
this.output = output;
}
// User is able to perform any single UM operation within 5 seconds upon invocation.A system message displays “UM operation was successful”
[Fact]
public void SingleOperationinFiveSec()
{
// Arrange
DateTime sTime = DateTime.Now;
var TestAcc = new UserAccount("newUser", "4567", "email@a.com", "regular", sTime);
var serviceTest = new AccountService();
string dbType = "sql";
RDSFactory dbFactory = new RDSFactory();
// Testing Data Access Layer
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo);
// Act
// Create a file
serviceTest.CreateUserRecord(TestAcc, "Rifat", datasource);
DateTime eTime = DateTime.Now;
TimeSpan timeDiff = (eTime - sTime);
var sec = timeDiff.TotalSeconds;
// Assert
if (sec > 5)
{
output.WriteLine("Single Operation was unsuccessful");
Assert.True(false);
}
else
{
Assert.True(true);
output.WriteLine("Single Operation was successful");
}
}
// Single UM operation takes longer than 5 seconds
[Fact]
public void FailSingleOperationinFiveSec()
{
// Arrange
DateTime sTime = DateTime.Now;
var TestAcc = new UserAccount("newUser", "4567", "email@a.com", "regular", sTime);
var serviceTest = new AccountService();
string dbType = "sql";
RDSFactory dbFactory = new RDSFactory();
// Testing Data Access Layer
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo);
// Act
// Create a file
serviceTest.CreateUserRecord(TestAcc, "Rifat", datasource);
Thread.Sleep(6000);
DateTime eTime = DateTime.Now;
TimeSpan timeDiff = (eTime - sTime);
var sec = timeDiff.TotalSeconds;
// Assert
if (sec > 5)
{
output.WriteLine("Single Operation was unsuccessful");
Assert.False(false);
}
else
{
Assert.True(false);
output.WriteLine("Single Operation was successful");
}
}
// Single UM operation completes within 5 seconds, but no system message is shown or inaccurate system message is shown
[Fact]
public void SingleOperationwithMessage()
{
// Arrange
DateTime sTime = DateTime.Now;
var TestAcc = new UserAccount("newUserMessage", "4567", "email@a.com", "regular", sTime);
var serviceTest = new AccountService();
string dbType = "sql";
RDSFactory dbFactory = new RDSFactory();
var checkMess = false;
// Testing Data Access Layer
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo);
// Act
// Create a file
serviceTest.CreateUserRecord(TestAcc, "Rifat", datasource);
DateTime eTime = DateTime.Now;
TimeSpan timeDiff = (eTime - sTime);
var sec = timeDiff.TotalSeconds;
// Assert
if (sec > 5)
{
var message = "Single Operation was unsuccessful";
Assert.False(true);
output.WriteLine(message);
if (checkMess)
{
Assert.False(true);
throw new Exception("Message was not printed");
}
}
else
{
Assert.True(true);
var message2 = "Single Operation was successful";
output.WriteLine(message2);
if (!checkMess)
{
output.WriteLine("Message was printed");
Assert.True(true);
}
}
}
// Bulk UM operations completes within 60 seconds, but no system message is shown or inaccurate system message is shown
[Fact]
public void BulkOperationwithMessage()
{
// Arrange
DateTime sTime = DateTime.Now;
var checkMess = false;
var serviceTest = new AccountService();
string dbType = "sql";
RDSFactory dbFactory = new RDSFactory();
string path = Directory.GetCurrentDirectory();
// Testing Data Access Layer
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo);
// Act
// Create a file
//for (int i = 0; i < 10000; i++)
//{
//var TestAcc = new UserAccount("newUser" + $"{i}", "4567", $"email{i}@a.com", "regular", sTime);
serviceTest.BulkOperation("Rifat", path + "\\Bulk.txt", datasource);
//}
DateTime eTime = DateTime.Now;
TimeSpan timeDiff = (eTime - sTime);
var sec = timeDiff.TotalSeconds;
// Assert
if (sec > 60)
{
var message = "Bulk Operation was unsuccessful";
Assert.True(false);
output.WriteLine(message);
if (checkMess)
{
Assert.True(false);
throw new Exception("Message was not printed");
}
}
else
{
Assert.True(true);
var message2 = "Bulk Operation was successful";
output.WriteLine(message2);
if (!checkMess)
{
output.WriteLine("Message was printed");
Assert.True(true);
}
}
}
// User is able to perform less than 10K UM operations in bulk within 60 seconds. A system message displays “Bulk UM operation was successful”
[Fact]
public void BulkOperationforSixty()
{
// Arrange
DateTime sTime = DateTime.Now;
var serviceTest = new AccountService();
string dbType = "sql";
RDSFactory dbFactory = new RDSFactory();
string dir = Directory.GetCurrentDirectory();
string path = dir + "\\Bulk.txt";
output.WriteLine(path);
// Testing Data Access Layer
string dbInfo = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"TCPIP=1;" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo);
// Act
// Create a file
//for (int i = 0; i < 10000; i++)
//{
//var TestAcc = new UserAccount("newUser" + $"{i}", "4567", $"email{i}@a.com", "regular", sTime);
serviceTest.BulkOperation("Rifat", path, datasource);
//}
DateTime eTime = DateTime.Now;
TimeSpan timeDiff = (eTime - sTime);
var sec = timeDiff.TotalSeconds;
// Assert
if (sec > 60)
{
output.WriteLine("Bulk Operation was unsuccessful");
Assert.True(false);
}
else
{
Assert.True(true);
output.WriteLine("Bulk Operation was successful");
}
}
}
}

View File

@ -1,148 +0,0 @@
// See https://aka.ms/new-console-template for more information
//using System.Data.SqlClient;
using System.IO.Compression;
using TeamHobby.HobbyProjectGenerator.Archive;
//using MySql.Data.MySqlClient;
using System.Data.Odbc;
public class HobbyMain
{
static void Main(string[] args)
{
// Testing file compression Start
//Console.WriteLine("Hello World!");
//// Testing Compressing a file
//string fileName = @"C:\Users\Chunchunmaru\Documents\csulbFall2021\HobbyProject\Source Code\TeamHobby.Main\rando";
////string fileName = @"arhiving2.txt";
//FileInfo fileInfo = new FileInfo(fileName);
//Console.WriteLine("File Name: {0}", fileInfo.FullName);
//SQLSource sqlSource = new SQLSource();
//bool res = sqlSource.CompressFile(fileName);
////bool res = CompressFile(fileName);
//Console.WriteLine(res);
//Console.WriteLine(CreateFileName());
// Testing File compression end
// testing end
// Testing connection to MariaDB
string connString = "user id=root;" + "password=Teamhobby;server=localhost;" + "Trusted_Connection=yes;" + "database=Alatreon; " + "connection timeout=5";
string connMariaDB = "server=localhost;port=3306;uid=root;pwd=Teamhobby;connection timeout=5";
//var conn = new SqlConnection(connString);
//// SqlConnection conn = new SqlConnection(connString);
string sqlQ = "Select * from log;";
//MySql.Data.MySqlClient.MySqlConnection connect;
//try
//{
// Console.WriteLine("Open connection: ");
// //connect = new MySql.Data.MySqlClient.MySqlConnection();
// //connect.ConnectionString = connMariaDB;
// //connect.Open();
// conn.Open();
// SqlCommand cmd = new SqlCommand(sqlQ, conn);
// SqlDataReader myReader = cmd.ExecuteReader();
// while (myReader.Read())
// {
// Console.WriteLine(myReader["Column1"].ToString());
// Console.WriteLine(myReader["Column2"].ToString());
// }
// conn.Close();
// //if (connect.State == System.Data.ConnectionState.Open)
// //{
// // Console.WriteLine("Connection established");
// //}
// //connect.Close();
//}
try
{
Console.WriteLine("Opening connection: ");
//Connection string for Connector/ODBC 3.51
string MyConString = "DRIVER={MariaDB ODBC 3.1 Driver};" +
"SERVER=localhost;" +
"DATABASE=hobby;" +
"UID=root;" +
"PASSWORD=Teamhobby;" +
"OPTION=3";
//Connect to MySQL using Connector/ODBC
//OdbcConnection MyConnection = new OdbcConnection(MyConString);
//MyConnection.Open();
//Console.WriteLine("\n !!! success, connected successfully !!!\n");
////Display connection information
//Console.WriteLine("Connection Information:");
//Console.WriteLine("\tConnection String:" +
// MyConnection.ConnectionString);
//Console.WriteLine("\tConnection Timeout:" +
// MyConnection.ConnectionTimeout);
//Console.WriteLine("\tDatabase:" +
// MyConnection.Database);
//Console.WriteLine("\tDataSource:" +
// MyConnection.DataSource);
//Console.WriteLine("\tDriver:" +
// MyConnection.Driver);
//Console.WriteLine("\tServerVersion:" +
// MyConnection.ServerVersion);
//Console.WriteLine("Connection Successful");
ReadData(MyConString);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine("COnnection failed");
}
}
public static void ReadData(string connectionString)
{
string queryString = "SELECT * from log;";
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
OdbcCommand command = new OdbcCommand(queryString, connection);
connection.Open();
// Execute the DataReader and access the data.
OdbcDataReader reader = command.ExecuteReader();
Console.WriteLine("Read the database");
while (reader.Read())
{
Console.WriteLine("Date={0} {1} {2} {3} {4} {5}", reader[0], reader[1], reader[2], reader[3], reader[4], reader[5]);
//Console.WriteLine("Col A: {0} ", reader[0]);
//Console.WriteLine("Column: " + reader.FieldCount);
//Console.WriteLine("Column={1}", reader[1]);
}
// Call Close when done reading.
reader.Close();
connection.Close();
}
}
public static string CreateFileName()
{
return DateTime.Now.ToString() + "archive.txt";
}
}

View File

@ -1,37 +0,0 @@
public class MasterController
{
public static void main(string[] args)
{
//The main Controller of the program, It will run all services here
// While loop to run everything
// 1. Initialize the Data Factory here
// 2. Create the SqlConnection object
int userInput = 0;
while (userInput != -1)
{
// Print the menu
//
if (userInput == 1)
{
// 1. User Managment goes here
}
// Trigger Archiving automatically
// Create new ArchiveManager object
// if (currentDate == 1){
// ArchiveManager.Controller()
// Logging also automatic
}
}
}

View File

@ -1,20 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<StartupObject>HobbyMain</StartupObject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Data.Odbc" Version="6.0.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TeamHobby.HobbyProjectGenerator.Archive\TeamHobby.HobbyProjectGenerator.Archive.csproj" />
</ItemGroup>
</Project>

View File

@ -1,46 +0,0 @@
title Use Case: Archiving
participant ArchiveController.cs
participant DataConnection
participant DataSourceFactory
participant SQLSource
participant MariaDB
activate ArchiveController.cs
activate DataConnection
ArchiveController.cs ->DataConnection:static DataConnection getDataConnection()
DataConnection -->ArchiveController.cs:return DataConnection
deactivate DataConnection
activate DataSourceFactory
ArchiveController.cs ->DataSourceFactory: new DataSourceFactory()
DataSourceFactory ->DataSourceFactory:DataSourceFactory()\nconstructor
ArchiveController.cs <-- DataSourceFactory:return DataSourceFactory
deactivate DataSourceFactory
activate SQLSource
ArchiveController.cs->SQLSource: IDataSource DataSourceFact.GetDataSource(String sourceName, string info)
SQLSource->SQLSource: SQLSource(string info)\nconstructor
SQLSource --> ArchiveController.cs :return SQLSource
loop #lightblue while true
alt #lightgreen date == 1
ArchiveController.cs ->ArchiveController.cs: string fileName = string CreateFileName( )
ArchiveController.cs -> SQLSource: int Compress(string fileName)
activate MariaDB
SQLSource -> MariaDB: int createArchive(string fileLocation)
MariaDB -->SQLSource:return 0
SQLSource ->MariaDB: int RemoveEntries()
MariaDB-->SQLSource:return 0
end
deactivate MariaDB
SQLSource-->ArchiveController.cs:return 0
end
deactivate ArchiveController.cs
deactivate SQLSource

View File

@ -1,46 +0,0 @@
title Use Case: Archiving
participant ArchiveController.cs
participant DataConnection
participant DataSourceFactory
participant SQLSource
participant MariaDB
activate ArchiveController.cs
activate DataConnection
ArchiveController.cs ->DataConnection:static DataConnection getDataConnection()
DataConnection -->ArchiveController.cs:return DataConnection
deactivate DataConnection
activate DataSourceFactory
ArchiveController.cs ->DataSourceFactory: new DataSourceFactory()
DataSourceFactory ->DataSourceFactory:DataSourceFactory()\nconstructor
ArchiveController.cs <-- DataSourceFactory:return DataSourceFactory
deactivate DataSourceFactory
activate SQLSource
ArchiveController.cs->SQLSource: IDataSource DataSourceFact.GetDataSource(String sourceName, string info)
SQLSource->SQLSource: SQLSource(string info)\nconstructor
SQLSource --> ArchiveController.cs :return SQLSource
loop #lightblue while true
alt #lightgreen date == 1
ArchiveController.cs ->ArchiveController.cs: string fileName = string CreateFileName( )
ArchiveController.cs -> SQLSource: int Compress(string fileName)
activate MariaDB
SQLSource -> MariaDB: int createArchive(string fileLocation)
MariaDB -->SQLSource:return 0
SQLSource ->MariaDB: int RemoveEntries()
MariaDB-->SQLSource:return 0
end
deactivate MariaDB
SQLSource-->ArchiveController.cs:return 0
end
deactivate ArchiveController.cs
deactivate SQLSource

View File

@ -1,69 +0,0 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TeamHobby.HobbyProjectGenerator;
using TeamHobby.HobbyProjectGenerator.Implementations;
namespace TeamHobby.UserManagement.Tests
{
[TestClass]
public class InMemeoryUserServiceShould
{
[TestMethod]
public void GetNoLogs()
{
// Triple A Format
// Arrange
var userService = new InMemoryUserService();
var expectedCount = 0;
// Act
var actualFetch = userService.GetAllUsers();
// Assert
// This is the best format
Assert.IsTrue(actualFetch.Count == expectedCount);
}
[TestMethod]
public void AllowValidUserInput()
{
// Triple A Format
// Arrange
var userService = new InMemoryUserService();
var expectedCount = 1;
var expectedUserMessage = "Test log entry";
// Act
var actual = userService.User("Test log entry");
var actualFetch = userService.GetAllUsers();
// Assert
// This is the best format
Assert.IsTrue(actualFetch.Count == expectedCount);
Assert.IsTrue(actualFetch[0].Contains(expectedUserMessage));
}
/*
[TestMethod]
public void Users()
{
// Triple A Format
// Arrange
var inMemoryUserService = new InMemoryUserService();
var expected = true;
// Act
var actual = inMemoryUserService.User("Potato");
// Assert
// This is the best format
Assert.IsTrue(expected == actual);
// Alternate is
//Assert.AreEqual(expected, actual);
}
*/
}
}

View File

@ -1,17 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
<PackageReference Include="MSTest.TestAdapter" Version="2.2.7" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.7" />
<PackageReference Include="coverlet.collector" Version="3.1.0" />
</ItemGroup>
</Project>

View File

@ -1,8 +1,7 @@
using System; using System;
using System.Data.Odbc; using System.Data.Odbc;
using TeamHobby.HobbyProjectGenerator.Archive; using TeamHobby.HobbyProjectGenerator.ServiceLayer;
using TeamHobby.HobbyProjectGenerator.DataAccess; using TeamHobby.HobbyProjectGenerator.DataAccessLayer;
using TeamHobby.HobbyProjectGenerator.UserManagement;
namespace TeamHobby.HobbyProjectGenerator.Main namespace TeamHobby.HobbyProjectGenerator.Main
{ {
@ -29,9 +28,14 @@ namespace TeamHobby.HobbyProjectGenerator.Main
// Loop Admin login // Loop Admin login
while (mainMenu is true) while (mainMenu is true)
{ {
// Create credentials object
GetCredentials credentials = new GetCredentials();
// Get DB credentials ***Both values currently hard coded, will update to user input later on.***
string dbUserName = "root";
string dbPassword = "Teamhobby";
// Admin Sign in // Admin Sign in
GetCredentials credentials = new GetCredentials();
Console.WriteLine("\nPlease Enter Admin Credentials " + Console.WriteLine("\nPlease Enter Admin Credentials " +
"or enter 0 to exit the machine\n"); "or enter 0 to exit the machine\n");
string? username = credentials.GetUserName(); string? username = credentials.GetUserName();
@ -56,8 +60,8 @@ namespace TeamHobby.HobbyProjectGenerator.Main
"TCPIP=1;" + "TCPIP=1;" +
"SERVER=localhost;" + "SERVER=localhost;" +
"DATABASE=hobby;" + "DATABASE=hobby;" +
"UID=root;" + $"UID={dbUserName};" +
"PASSWORD=Teamhobby;" + $"PASSWORD={dbPassword};" +
"OPTION=3"; "OPTION=3";
IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo); IDataSource<string> datasource = dbFactory.getDataSource(dbType, dbInfo);

View File

@ -1,163 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Odbc;
using TeamHobby.HobbyProjectGenerator.DataAccess;
using TeamHobby.HobbyProjectGenerator.UserManagement;
namespace main
{
public class ExtractBulkOp
{
public void ExtractBulkOP(string signedUser, IDataSource<string> dbSource)
//public static void Main(string[] args)
{
try
{
// Get the current directory.
string path = Directory.GetCurrentDirectory();
// Open file reader stream
using StreamReader fileRead = new(path + "\\BulkOps\\Bulk.txt"); // path + "\\BulkOps\\{input}"
// Show location of the file being written
Console.WriteLine(path + "\\BulkOps\\Bulk.txt");
// List choices of operations
List<string> ops = new List<string> {"Create Account", "Edit Account",
"Delete Account", "Disable Account", "Enable Account"};
// List to hold file operation and credentials
List<string> fileList = new List<string>();
string operation = "";
string UN = "";
string PWD = "";
string Role = "";
string Email = "";
// Loop through file rows
while (!fileRead.EndOfStream)
{
// Create variable to hold current line
string line = fileRead.ReadLine();
// Check if line is not empty and contains the separator
if (line != null && line.Contains(":"))
{
// Assign value to hold current line parameter
string value = line.Split(':')[1].Trim();
// Check what operation is being called
if (ops.Contains(value))
{
// Add operation into temp
//Console.WriteLine("Found operation");
//Console.WriteLine(value);
operation = value;
}
else
{
string checkCredential = line.Split(':')[0].Trim();
//Console.WriteLine("Found credential");
switch (checkCredential)
{
case "Username":
UN = value;
break;
case "Password":
PWD = value;
break;
case "Role":
Role = value;
break;
case "Email":
Email = value;
break;
default:
break;
}
}
}
switch (operation)
{
case "Create Account":
//Console.WriteLine(operation);
if (String.IsNullOrEmpty(Role))
{
Role = null;
// Create UserAccount object
UserAccount user = new UserAccount(UN, PWD, Email, DateTime.UtcNow);
// Create Account service object
AccountService serviceTest = new AccountService();
Console.WriteLine($"VALUES ('{user.username}', " +
$"'{user.password}','{user.role}', 1," +
$"'Jacob', NOW(),'{user.email}');");
//Console.WriteLine(serviceTest.CreateUserRecord(user, 'Jacob', dbSource));
}
else if (String.IsNullOrEmpty(Email))
{
Email = null;
// Create UserAccount object
UserAccount user = new UserAccount(UN, PWD, Role);
// Create Account service object
AccountService serviceTest = new AccountService();
Console.WriteLine($"VALUES ('{user.username}', " +
$"'{user.password}','{user.role}', 1," +
$"'Jacob', NOW(),'{user.email}');");
//serviceTest.CreateUserRecord(user, signedUser, dbSource);
}
else
{
// Console.WriteLine(UN);
// Create UserAccount object
UserAccount user = new UserAccount(UN, PWD, DateTime.UtcNow);
// Create Account service object
AccountService serviceTest = new AccountService();
if (user.email == null)
{
Console.WriteLine("wokring correctly");
}
else
{
Console.WriteLine($"VALUES ('{user.username}', " +
$"'{user.password}','{user.role}', 1," +
$"'Jacob', NOW(),'{user.email}');");
//serviceTest.CreateUserRecord(user, signedUser, dbSource);
}
}
break;
case "Edit Account":
//Console.WriteLine(operation);
//Console.WriteLine(operation);
break;
case "Delete Account":
//Console.WriteLine(operation);
//Console.WriteLine(operation);
break;
case "Disable Account":
//Console.WriteLine(operation);
//Console.WriteLine(operation);
break;
case "Enable Account":
//Console.WriteLine(operation);
//Console.WriteLine(operation);
break;
default:
break;
}
}
fileRead.Close();
}
catch (Exception e)
{
Console.WriteLine("Error reading file");
Console.WriteLine(e.Message);
}
}
}
}

View File

@ -3,8 +3,8 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using TeamHobby.HobbyProjectGenerator.DataAccess; using TeamHobby.HobbyProjectGenerator.DataAccessLayer;
using TeamHobby.HobbyProjectGenerator.UserManagement; using TeamHobby.HobbyProjectGenerator.ServiceLayer;
namespace main namespace main
{ {

View File

@ -14,9 +14,8 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\TeamHobby.HobbyProjectGenerator.Archive\TeamHobby.HobbyProjectGenerator.Archive.csproj" /> <ProjectReference Include="..\TeamHobby.HobbyProjectGenerator.DataAccessLayer\TeamHobby.HobbyProjectGenerator.DataAccessLayer.csproj" />
<ProjectReference Include="..\TeamHobby.HobbyProjectGenerator.DataAccess\TeamHobby.HobbyProjectGenerator.DataAccess.csproj" /> <ProjectReference Include="..\TeamHobby.HobbyProjectGenerator\TeamHobby.HobbyProjectGenerator.ServiceLayer\TeamHobby.HobbyProjectGenerator.ServiceLayer.csproj" />
<ProjectReference Include="..\TeamHobby.HobbyProjectGenerator.UserManagement\TeamHobby.HobbyProjectGenerator.UserManagement.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 KiB

After

Width:  |  Height:  |  Size: 314 KiB

Binary file not shown.

View File

@ -1,3 +1,5 @@
DROP DATABASE IF EXISTS Hobby;
create database Hobby; create database Hobby;
use hobby; use hobby;
@ -27,6 +29,10 @@ create table users
foreign key (Role) references roles (Role) foreign key (Role) references roles (Role)
); );
INSERT INTO hobby.roles (Role, CreatedBy, CreatedDate) VALUES
('Admin', 'Jacob', '2021-12-13 03:25:14'),
('regular', 'Jacob', '2021-12-13 03:25:14');
INSERT INTO hobby.users (UserName, Password, Role, IsActive, CreatedBy, CreatedDate, Email) VALUES INSERT INTO hobby.users (UserName, Password, Role, IsActive, CreatedBy, CreatedDate, Email) VALUES
('Colin ', 'Waffle', 'Admin', 1, 'Jacob', '2021-12-13 04:27:42', null), ('Colin ', 'Waffle', 'Admin', 1, 'Jacob', '2021-12-13 04:27:42', null),
@ -36,11 +42,6 @@ INSERT INTO hobby.users (UserName, Password, Role, IsActive, CreatedBy, CreatedD
('Rifat', '1234', 'Admin', 1, 'Jacob', '2021-12-13 04:29:55', null); ('Rifat', '1234', 'Admin', 1, 'Jacob', '2021-12-13 04:29:55', null);
INSERT INTO hobby.roles (Role, CreatedBy, CreatedDate) VALUES
('Admin', 'Jacob', '2021-12-13 03:25:14'),
('regular', 'Jacob', '2021-12-13 03:25:14');
SET Global innodb_file_per_table=ON; SET Global innodb_file_per_table=ON;
SET GLOBAL innodb_default_row_format='dynamic'; SET GLOBAL innodb_default_row_format='dynamic';
@ -57,7 +58,7 @@ CREATE TABLE Persons (
City varchar(255) City varchar(255)
); );
CREATE DATABASE testDB; -- CREATE DATABASE testDB;
-- Hobby DDL -- Hobby DDL
-- Log level table -- Log level table
@ -115,6 +116,7 @@ INSERT into log(lvname, catname, userop, logmessage) values
('Info', 'View', 'log out', 'log out successful'), ('Info', 'View', 'log out', 'log out successful'),
('Info', 'Business', 'log in', 'log in successfully'), ('Info', 'Business', 'log in', 'log in successfully'),
('Info', 'View', 'search for projects', 'result return'); ('Info', 'View', 'search for projects', 'result return');
show tables;