test(Discord) Added test logs to discord and start of discord chat bot
This commit is contained in:
@@ -46,4 +46,6 @@ jobs:
|
|||||||
dotnet-version: 6.0.*
|
dotnet-version: 6.0.*
|
||||||
- run: dotnet restore
|
- run: dotnet restore
|
||||||
- run: dotnet build --no-restore
|
- run: dotnet build --no-restore
|
||||||
- run: dotnet test --no-build --verbosity normal
|
- run: dotnet test --no-build --verbosity normal
|
||||||
|
env:
|
||||||
|
TEST_HOOK: ${{ secrets.TEST_HOOK }}
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
name: Run Development Tests
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
logLevel:
|
|
||||||
description: 'Log level'
|
|
||||||
required: true
|
|
||||||
default: 'warning'
|
|
||||||
tags:
|
|
||||||
description: 'Test scenario tags'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Setup .NET
|
|
||||||
uses: actions/setup-dotnet@v2
|
|
||||||
with:
|
|
||||||
dotnet-version: 5.0.x
|
|
||||||
- name: Change Directory
|
|
||||||
run: cd TestAutomation | dotnet restore |dotnet build --no-restore | dotnet test --no-build --verbosity normal
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
node_modules
|
||||||
|
.env
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
worker: node index.js
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# Discord bot example
|
||||||
|
|
||||||
|
Read this [article](https://medium.freecodecamp.org/how-to-create-a-discord-bot-under-15-minutes-fb2fd0083844) to fully understand what this is about 😃
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
|
||||||
|
1. Clone this repository
|
||||||
|
2. Run `npm install`
|
||||||
|
3. Grab a token on [Discord's developer portal](https://discordapp.com/developers/applications)
|
||||||
|
4. Create a `.env` file and add a `BOT_TOKEN` environmental variable whose value is the token above.
|
||||||
|
5. Run `npm run dev`
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
module.exports = message => {
|
||||||
|
const member = message.mentions.members.first();
|
||||||
|
|
||||||
|
if (!member) {
|
||||||
|
return message.reply(
|
||||||
|
`Who are you trying to kick? You must mention a user.`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!member.kickable) {
|
||||||
|
return message.reply(`I can't kick this user. Sorry!`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return member
|
||||||
|
.kick()
|
||||||
|
.then(() => message.reply(`${member.user.tag} was kicked.`))
|
||||||
|
.catch(error => message.reply(`Sorry, an error occured.`));
|
||||||
|
};
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
module.exports = (client, member) => {
|
||||||
|
member.send(
|
||||||
|
`Welcome on the server! Please be aware that we won't tolerate troll, spam or harassment. Have fun 😀`
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
const kick = require("../commands/kick");
|
||||||
|
|
||||||
|
module.exports = (client, message) => {
|
||||||
|
if (message.content.startsWith("!kick")) {
|
||||||
|
return kick(message);
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
module.exports = client => {
|
||||||
|
console.log(`Logged in as ${client.user.tag}!`);
|
||||||
|
};
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
require("dotenv").config();
|
||||||
|
const Discord = require("discord.js");
|
||||||
|
const fs = require("fs");
|
||||||
|
const client = new Discord.Client();
|
||||||
|
|
||||||
|
fs.readdir("./events/", (err, files) => {
|
||||||
|
files.forEach(file => {
|
||||||
|
const eventHandler = require(`./events/${file}`);
|
||||||
|
const eventName = file.split(".")[0];
|
||||||
|
client.on(eventName, (...args) => eventHandler(client, ...args));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
client.login(process.env.BOT_TOKEN);
|
||||||
|
|
||||||
|
client.channels.find(x=> x.id === "969297543538311248");
|
||||||
|
|
||||||
Generated
+5938
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "discord-bot",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node index.js",
|
||||||
|
"dev": "nodemon index.js"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"discord.js": "^11.4.2",
|
||||||
|
"dotenv": "^7.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"nodemon": "^1.18.11"
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
[{"Id":1,"Name":"Database UX Patch","Date":"2022-03-13T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":2,"Name":"Thrum Stats Hotfix","Date":"2022-03-12T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":3,"Name":"Memory Tester Patch","Date":"2022-03-01T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":4,"Name":"Hide Pyre Hotfix","Date":"2022-02-20T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":5,"Name":"Stream Patch 1","Date":"2022-02-20T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":6,"Name":"Agile UI Hotfix","Date":"2022-02-20T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":7,"Name":"Armor Patch","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":8,"Name":"Home Page Patch","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":9,"Name":"Mobile Menu Hotfix 2","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":10,"Name":"Mobile Menu Hotfix","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":11,"Name":"Mobile Menu Patch","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":12,"Name":"0.0.6.8375a Patch","Date":"2022-02-18T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":13,"Name":"Google Tracking Hotfix","Date":"2022-02-18T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":14,"Name":"Privacy Policy Patch","Date":"2022-02-17T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":15,"Name":"Home Page Quick Hotfix","Date":"2022-02-16T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":16,"Name":"Early Agile Patch","Date":"2022-02-16T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":17,"Name":"Form Text Rendering Hotfix","Date":"2022-02-15T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":18,"Name":"Reducing Timing Interval Hotfix","Date":"2022-02-15T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":19,"Name":"Changelog Patch","Date":"2022-02-14T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":20,"Name":"SQL Patch","Date":"2022-03-26T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":21,"Name":"Stream Patch 2","Date":"2022-03-30T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":22,"Name":"0.0.6.8900a Patch","Date":"2022-03-30T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":23,"Name":"Database Links Patch","Date":"2022-04-01T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":24,"Name":"Open Source Patch","Date":"2022-04-03T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":25,"Name":"Stream Patch 3","Date":"2022-04-03T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":26,"Name":"Notes/Docs Patch","Date":"2022-04-10T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":27,"Name":"Stream Patch 4","Date":"2022-04-10T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":28,"Name":"Passive Patch","Date":"2022-04-12T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":29,"Name":"0.0.6.9121a Patch","Date":"2022-04-13T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":30,"Name":"Stream Patch 5","Date":"2022-04-13T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":31,"Name":"BuildCalc Hotfix","Date":"2022-04-13T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":32,"Name":"Search Patch","Date":"2022-04-16T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":33,"Name":"Search Hotfix","Date":"2022-04-16T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":34,"Name":"Stream Patch 6","Date":"2022-04-17T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":35,"Name":"v0.0.6.9201a Patch","Date":"2022-04-18T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":36,"Name":"Build Calc Free Money Hotfix","Date":"2022-04-18T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":37,"Name":"BuildCalc Pyre Patch","Date":"2022-04-24T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":38,"Name":"Stream Patch 7","Date":"2022-04-24T00:00:00","GitChangeModels":[],"Important":"False"}]
|
[{"Id":1,"Name":"Database UX Patch","Date":"2022-03-13T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":2,"Name":"Thrum Stats Hotfix","Date":"2022-03-12T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":3,"Name":"Memory Tester Patch","Date":"2022-03-01T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":4,"Name":"Hide Pyre Hotfix","Date":"2022-02-20T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":5,"Name":"Stream Patch 1","Date":"2022-02-20T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":6,"Name":"Agile UI Hotfix","Date":"2022-02-20T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":7,"Name":"Armor Patch","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":8,"Name":"Home Page Patch","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":9,"Name":"Mobile Menu Hotfix 2","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":10,"Name":"Mobile Menu Hotfix","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":11,"Name":"Mobile Menu Patch","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":12,"Name":"0.0.6.8375a Patch","Date":"2022-02-18T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":13,"Name":"Google Tracking Hotfix","Date":"2022-02-18T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":14,"Name":"Privacy Policy Patch","Date":"2022-02-17T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":15,"Name":"Home Page Quick Hotfix","Date":"2022-02-16T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":16,"Name":"Early Agile Patch","Date":"2022-02-16T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":17,"Name":"Form Text Rendering Hotfix","Date":"2022-02-15T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":18,"Name":"Reducing Timing Interval Hotfix","Date":"2022-02-15T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":19,"Name":"Changelog Patch","Date":"2022-02-14T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":20,"Name":"SQL Patch","Date":"2022-03-26T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":21,"Name":"Stream Patch 2","Date":"2022-03-30T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":22,"Name":"0.0.6.8900a Patch","Date":"2022-03-30T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":23,"Name":"Database Links Patch","Date":"2022-04-01T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":24,"Name":"Open Source Patch","Date":"2022-04-03T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":25,"Name":"Stream Patch 3","Date":"2022-04-03T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":26,"Name":"Notes/Docs Patch","Date":"2022-04-10T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":27,"Name":"Stream Patch 4","Date":"2022-04-10T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":28,"Name":"Passive Patch","Date":"2022-04-12T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":29,"Name":"0.0.6.9121a Patch","Date":"2022-04-13T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":30,"Name":"Stream Patch 5","Date":"2022-04-13T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":31,"Name":"BuildCalc Hotfix","Date":"2022-04-13T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":32,"Name":"Search Patch","Date":"2022-04-16T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":33,"Name":"Search Hotfix","Date":"2022-04-16T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":34,"Name":"Stream Patch 6","Date":"2022-04-17T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":35,"Name":"v0.0.6.9201a Patch","Date":"2022-04-18T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":36,"Name":"Build Calc Free Money Hotfix","Date":"2022-04-18T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":37,"Name":"BuildCalc Pyre Patch","Date":"2022-04-24T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":38,"Name":"Stream Patch 7","Date":"2022-04-24T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":39,"Name":"Infrastructure Patch","Date":"2022-05-20T00:00:00","GitChangeModels":[],"Important":"False"}]
|
||||||
@@ -1,13 +1,11 @@
|
|||||||
using OpenQA.Selenium;
|
using TestAutomation.Utils;
|
||||||
|
|
||||||
namespace TestAutomation.Pages;
|
namespace TestAutomation.Pages;
|
||||||
|
|
||||||
public class BasePage {
|
public class BasePage {
|
||||||
|
public Website website;
|
||||||
|
|
||||||
public Website website;
|
|
||||||
|
|
||||||
public BasePage(Website website) {
|
public BasePage(Website website) {
|
||||||
this.website = website;
|
this.website = website;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,14 +1,17 @@
|
|||||||
namespace TestAutomation.Pages;
|
using TestAutomation.Utils;
|
||||||
|
|
||||||
|
namespace TestAutomation.Pages;
|
||||||
|
|
||||||
public class HarassCalculatorPage : BasePage {
|
public class HarassCalculatorPage : BasePage {
|
||||||
|
public HarassCalculatorPage(Website website) : base(website) { }
|
||||||
private IWebElement NumberOfWorkersLostToHarass => website.Find("numberOfWorkersLostToHarass");
|
private IWebElement NumberOfWorkersLostToHarass => website.Find("numberOfWorkersLostToHarass");
|
||||||
private IWebElement NumberOfTownHallsExisting => website.Find("numberOfTownHallsExisting");
|
private IWebElement NumberOfTownHallsExisting => website.Find("numberOfTownHallsExisting");
|
||||||
private IList<IWebElement> OnTownHallTravelTimes => website.FindChildren("numberOfTownHallTravelTimes", "input");
|
private IList<IWebElement> OnTownHallTravelTimes => website.FindChildren("numberOfTownHallTravelTimes", "input");
|
||||||
private int TotalAlloyHarassment => website.FindInt("totalAlloyHarassment");
|
private int TotalAlloyHarassment => website.FindInt("totalAlloyHarassment");
|
||||||
private int WorkerReplacementCost => website.FindInt("workerReplacementCost");
|
private int WorkerReplacementCost => website.FindInt("workerReplacementCost");
|
||||||
private int DelayedMiningCost => website.FindInt("delayedMiningCost");
|
private int DelayedMiningCost => website.FindInt("delayedMiningCost");
|
||||||
private int AverageTravelTime => website.FindInt("getAverageTravelTime");
|
private int AverageTravelTime => website.FindInt("getAverageTravelTime");
|
||||||
|
|
||||||
private int ExampleTotalAlloyLoss => website.FindInt("exampleTotalAlloyLoss");
|
private int ExampleTotalAlloyLoss => website.FindInt("exampleTotalAlloyLoss");
|
||||||
private int ExampleWorkerCost => website.FindInt("exampleWorkerCost");
|
private int ExampleWorkerCost => website.FindInt("exampleWorkerCost");
|
||||||
private int ExampleMiningTimeCost => website.FindInt("exampleMiningTimeCost");
|
private int ExampleMiningTimeCost => website.FindInt("exampleMiningTimeCost");
|
||||||
@@ -16,29 +19,27 @@ public class HarassCalculatorPage : BasePage {
|
|||||||
private int ExampleTotalAlloyLossAccurate => website.FindInt("exampleTotalAlloyLossAccurate");
|
private int ExampleTotalAlloyLossAccurate => website.FindInt("exampleTotalAlloyLossAccurate");
|
||||||
private int ExampleTotalAlloyLossAccurateDifference => website.FindInt("exampleTotalAlloyLossAccurateDifference");
|
private int ExampleTotalAlloyLossAccurateDifference => website.FindInt("exampleTotalAlloyLossAccurateDifference");
|
||||||
|
|
||||||
public HarassCalculatorPage(Website website) : base(website) { }
|
|
||||||
|
|
||||||
public HarassCalculatorPage SetWorkersLostToHarass(int number) {
|
public HarassCalculatorPage SetWorkersLostToHarass(int number) {
|
||||||
website.EnterInput(NumberOfWorkersLostToHarass, number);
|
website.EnterInput(NumberOfWorkersLostToHarass, number);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HarassCalculatorPage SetNumberOfTownHallsExisting(int number) {
|
public HarassCalculatorPage SetNumberOfTownHallsExisting(int number) {
|
||||||
website.EnterInput(NumberOfTownHallsExisting, number);
|
website.EnterInput(NumberOfTownHallsExisting, number);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HarassCalculatorPage SetTownHallTravelTime(int forTownHall, int number) {
|
public HarassCalculatorPage SetTownHallTravelTime(int forTownHall, int number) {
|
||||||
website.EnterInput(OnTownHallTravelTimes[forTownHall], number);
|
website.EnterInput(OnTownHallTravelTimes[forTownHall], number);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HarassCalculatorPage GetTotalAlloyHarassment(out int result) {
|
public HarassCalculatorPage GetTotalAlloyHarassment(out int result) {
|
||||||
result = TotalAlloyHarassment;
|
result = TotalAlloyHarassment;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public HarassCalculatorPage GetExampleTotalAlloyLoss(out int result) {
|
public HarassCalculatorPage GetExampleTotalAlloyLoss(out int result) {
|
||||||
result = ExampleTotalAlloyLoss;
|
result = ExampleTotalAlloyLoss;
|
||||||
return this;
|
return this;
|
||||||
@@ -53,18 +54,19 @@ public class HarassCalculatorPage : BasePage {
|
|||||||
result = ExampleMiningTimeCost;
|
result = ExampleMiningTimeCost;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HarassCalculatorPage GetExampleTotalAlloyLossAccurate(out int result) {
|
public HarassCalculatorPage GetExampleTotalAlloyLossAccurate(out int result) {
|
||||||
result = ExampleTotalAlloyLossAccurate;
|
result = ExampleTotalAlloyLossAccurate;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HarassCalculatorPage GetExampleTotalAlloyLossDifference(out int result) {
|
public HarassCalculatorPage GetExampleTotalAlloyLossDifference(out int result) {
|
||||||
result = ExampleTotalAlloyLossDifference;
|
result = ExampleTotalAlloyLossDifference;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HarassCalculatorPage GetExampleTotalAlloyLossAccurateDifference(out int result) {
|
public HarassCalculatorPage GetExampleTotalAlloyLossAccurateDifference(out int result) {
|
||||||
result = ExampleTotalAlloyLossAccurateDifference;
|
result = ExampleTotalAlloyLossAccurateDifference;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,8 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Discord.Net.Webhook" Version="3.6.0" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0-preview.2.22152.2" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
|
||||||
<PackageReference Include="NUnit" Version="3.13.2" />
|
<PackageReference Include="NUnit" Version="3.13.2" />
|
||||||
<PackageReference Include="NUnit3TestAdapter" Version="4.2.0" />
|
<PackageReference Include="NUnit3TestAdapter" Version="4.2.0" />
|
||||||
|
|||||||
@@ -1,119 +0,0 @@
|
|||||||
|
|
||||||
namespace TestAutomation;
|
|
||||||
|
|
||||||
public class Tests
|
|
||||||
{
|
|
||||||
private IWebDriver _webDriver = default!;
|
|
||||||
|
|
||||||
private readonly string localhost = "https://localhost:7234";
|
|
||||||
private readonly string develop = "https://calm-mud-04916b210.1.azurestaticapps.net/";
|
|
||||||
|
|
||||||
private Website Website { get; }
|
|
||||||
|
|
||||||
public Tests() {
|
|
||||||
var options = new FirefoxOptions();
|
|
||||||
//var options = new ChromeOptions();
|
|
||||||
|
|
||||||
options.AcceptInsecureCertificates = true;
|
|
||||||
options.AddArgument("--headless");
|
|
||||||
options.AddArgument("--ignore-certificate-errors");
|
|
||||||
options.AddArgument("--start-maximized");
|
|
||||||
options.AddArgument("--test-type");
|
|
||||||
options.AddArgument("--allow-running-insecure-content");
|
|
||||||
|
|
||||||
//_webDriver = new FirefoxDriver(options);
|
|
||||||
//_webDriver = new ChromeDriver(Environment.CurrentDirectory, options);
|
|
||||||
_webDriver = new FirefoxDriver(Environment.CurrentDirectory, options);
|
|
||||||
|
|
||||||
|
|
||||||
Website = new Website(_webDriver);
|
|
||||||
}
|
|
||||||
|
|
||||||
[OneTimeSetUp]
|
|
||||||
public void Setup()
|
|
||||||
{
|
|
||||||
_webDriver.Navigate().GoToUrl(develop);
|
|
||||||
_webDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(15);
|
|
||||||
}
|
|
||||||
|
|
||||||
[OneTimeTearDown]
|
|
||||||
public void TearDown()
|
|
||||||
{
|
|
||||||
_webDriver.Quit();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void HarassCalculator()
|
|
||||||
{
|
|
||||||
_webDriver.Navigate().GoToUrl(develop + "/harass-calculator");
|
|
||||||
|
|
||||||
int expectedTotalAlloyHarassment = 240;
|
|
||||||
|
|
||||||
Website.HarassCalculatorPage
|
|
||||||
.SetWorkersLostToHarass(3)
|
|
||||||
.SetNumberOfTownHallsExisting(2)
|
|
||||||
.SetTownHallTravelTime(0, 30)
|
|
||||||
.GetTotalAlloyHarassment(out var foundTotalAlloyHarassment);
|
|
||||||
|
|
||||||
Assert.True(expectedTotalAlloyHarassment.Equals(foundTotalAlloyHarassment),
|
|
||||||
$"expectTotalAlloyHarassment of {expectedTotalAlloyHarassment} " +
|
|
||||||
"does not equal " +
|
|
||||||
$"foundTotalAlloyHarassment of {foundTotalAlloyHarassment} ");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void HarassCalculatorInformation()
|
|
||||||
{
|
|
||||||
_webDriver.Navigate().GoToUrl(develop + "/harass-calculator");
|
|
||||||
|
|
||||||
int expectedExampleTotalAlloyLoss = 720;
|
|
||||||
int expectedExampleWorkerCost = 300;
|
|
||||||
int expectedExampleMiningTimeCost = 420;
|
|
||||||
int expectedExampleTotalAlloyLossDifference = 300;
|
|
||||||
int expectedExampleTotalAlloyLossAccurate = 450;
|
|
||||||
int expectedExampleTotalAlloyLossAccurateDifference = 270;
|
|
||||||
|
|
||||||
Website.HarassCalculatorPage
|
|
||||||
.GetExampleTotalAlloyLoss(out var foundTotalAlloyLoss)
|
|
||||||
.GetExampleWorkerCost(out var foundExampleWorkerCost)
|
|
||||||
.GetExampleMiningTimeCost(out var foundExampleMiningTimeCost)
|
|
||||||
.GetExampleTotalAlloyLossAccurate(out var foundExampleTotalAlloyLossAccurate)
|
|
||||||
.GetExampleTotalAlloyLossDifference(out var foundGetExampleTotalAlloyLossDifference)
|
|
||||||
.GetExampleTotalAlloyLossAccurateDifference(out var foundExampleTotalAlloyLossAccurateDifference);
|
|
||||||
|
|
||||||
Assert.True(expectedExampleTotalAlloyLoss.Equals(foundTotalAlloyLoss),
|
|
||||||
$"expectedExampleTotalAlloyLoss of {expectedExampleTotalAlloyLoss} " +
|
|
||||||
"does not equal " +
|
|
||||||
$"foundTotalAlloyLoss of {foundTotalAlloyLoss} ");
|
|
||||||
|
|
||||||
Assert.True(expectedExampleWorkerCost.Equals(foundExampleWorkerCost),
|
|
||||||
$"expectedExampleWorkerCost of {expectedExampleWorkerCost} " +
|
|
||||||
"does not equal " +
|
|
||||||
$"foundExampleWorkerCost of {foundExampleWorkerCost} ");
|
|
||||||
|
|
||||||
|
|
||||||
Assert.True(expectedExampleMiningTimeCost.Equals(foundExampleMiningTimeCost),
|
|
||||||
$"expectedExampleMiningTimeCost of {expectedExampleMiningTimeCost} " +
|
|
||||||
"does not equal " +
|
|
||||||
$"foundExampleMiningTimeCost of {foundExampleMiningTimeCost} ");
|
|
||||||
|
|
||||||
|
|
||||||
Assert.True(expectedExampleTotalAlloyLossAccurate.Equals(foundExampleTotalAlloyLossAccurate),
|
|
||||||
$"expectedExampleTotalAlloyLossAccurate of {expectedExampleTotalAlloyLossAccurate} " +
|
|
||||||
"does not equal " +
|
|
||||||
$"foundExampleTotalAlloyLossAccurate of {foundExampleTotalAlloyLossAccurate} ");
|
|
||||||
|
|
||||||
|
|
||||||
Assert.True(expectedExampleTotalAlloyLossDifference.Equals(foundGetExampleTotalAlloyLossDifference),
|
|
||||||
$"expectedExampleTotalAlloyLossDifference of {expectedExampleTotalAlloyLossDifference} " +
|
|
||||||
"does not equal " +
|
|
||||||
$"foundGetExampleTotalAlloyLossDifference of {foundGetExampleTotalAlloyLossDifference} ");
|
|
||||||
|
|
||||||
|
|
||||||
Assert.True(expectedExampleTotalAlloyLossAccurateDifference.Equals(foundExampleTotalAlloyLossAccurateDifference),
|
|
||||||
$"expectedExampleTotalAlloyLossAccurateDifference of {expectedExampleTotalAlloyLossAccurateDifference} " +
|
|
||||||
"does not equal " +
|
|
||||||
$"foundExampleTotalAlloyLossAccurateDifference of {foundExampleTotalAlloyLossAccurateDifference} ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,141 @@
|
|||||||
|
using System.Text;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using TestAutomation.Utils;
|
||||||
|
|
||||||
|
namespace TestAutomation;
|
||||||
|
|
||||||
|
public class Tests {
|
||||||
|
private readonly IWebDriver _webDriver = default!;
|
||||||
|
private readonly string develop = "https://calm-mud-04916b210.1.azurestaticapps.net/";
|
||||||
|
|
||||||
|
private readonly HttpClient httpClient = new();
|
||||||
|
|
||||||
|
|
||||||
|
private readonly string localhost = "https://localhost:7234";
|
||||||
|
|
||||||
|
private readonly TestReport testReport = new();
|
||||||
|
|
||||||
|
public Tests() {
|
||||||
|
var options = new FirefoxOptions();
|
||||||
|
|
||||||
|
options.AcceptInsecureCertificates = true;
|
||||||
|
options.AddArgument("--headless");
|
||||||
|
options.AddArgument("--ignore-certificate-errors");
|
||||||
|
options.AddArgument("--start-maximized");
|
||||||
|
options.AddArgument("--test-type");
|
||||||
|
options.AddArgument("--allow-running-insecure-content");
|
||||||
|
|
||||||
|
_webDriver = new FirefoxDriver(Environment.CurrentDirectory, options);
|
||||||
|
|
||||||
|
Website = new Website(_webDriver);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Website Website { get; }
|
||||||
|
|
||||||
|
[OneTimeSetUp]
|
||||||
|
public void Setup() {
|
||||||
|
_webDriver.Navigate().GoToUrl(develop);
|
||||||
|
_webDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(15);
|
||||||
|
}
|
||||||
|
|
||||||
|
[OneTimeTearDown]
|
||||||
|
public void TearDown() {
|
||||||
|
_webDriver.Quit();
|
||||||
|
|
||||||
|
|
||||||
|
var message = new {
|
||||||
|
content = "Test Report " + DateTime.Now.ToString("dd/MM/yyyy"),
|
||||||
|
embeds = testReport.GetMessages()
|
||||||
|
};
|
||||||
|
|
||||||
|
var content = new StringContent(JsonConvert.SerializeObject(message), Encoding.UTF8, "application/json");
|
||||||
|
|
||||||
|
httpClient.PostAsync(Environment.GetEnvironmentVariable("TEST_HOOK"), content).Wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void HarassCalculator() {
|
||||||
|
testReport.CreateTest();
|
||||||
|
|
||||||
|
_webDriver.Navigate().GoToUrl(develop + "/harass-calculator");
|
||||||
|
|
||||||
|
var expectedTotalAlloyHarassment = 240;
|
||||||
|
|
||||||
|
try {
|
||||||
|
Website.HarassCalculatorPage
|
||||||
|
.SetWorkersLostToHarass(3)
|
||||||
|
.SetNumberOfTownHallsExisting(2)
|
||||||
|
.SetTownHallTravelTime(0, 30)
|
||||||
|
.GetTotalAlloyHarassment(out var foundTotalAlloyHarassment);
|
||||||
|
|
||||||
|
testReport.CheckPassed(expectedTotalAlloyHarassment.Equals(foundTotalAlloyHarassment),
|
||||||
|
TestMessage.CreateFailedMessage($"expectTotalAlloyHarassment of {expectedTotalAlloyHarassment} " +
|
||||||
|
"does not equal " +
|
||||||
|
$"foundTotalAlloyHarassment of {foundTotalAlloyHarassment} "));
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
testReport.CheckPassed(false,
|
||||||
|
TestMessage.CreateFailedMessage(e.StackTrace!));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void HarassCalculatorInformation() {
|
||||||
|
testReport.CreateTest();
|
||||||
|
|
||||||
|
_webDriver.Navigate().GoToUrl(develop + "/harass-calculator");
|
||||||
|
|
||||||
|
var expectedExampleTotalAlloyLoss = 720;
|
||||||
|
var expectedExampleWorkerCost = 300;
|
||||||
|
var expectedExampleMiningTimeCost = 420;
|
||||||
|
var expectedExampleTotalAlloyLossDifference = 300;
|
||||||
|
var expectedExampleTotalAlloyLossAccurate = 450;
|
||||||
|
var expectedExampleTotalAlloyLossAccurateDifference = 270;
|
||||||
|
|
||||||
|
Website.HarassCalculatorPage
|
||||||
|
.GetExampleTotalAlloyLoss(out var foundTotalAlloyLoss)
|
||||||
|
.GetExampleWorkerCost(out var foundExampleWorkerCost)
|
||||||
|
.GetExampleMiningTimeCost(out var foundExampleMiningTimeCost)
|
||||||
|
.GetExampleTotalAlloyLossAccurate(out var foundExampleTotalAlloyLossAccurate)
|
||||||
|
.GetExampleTotalAlloyLossDifference(out var foundGetExampleTotalAlloyLossDifference)
|
||||||
|
.GetExampleTotalAlloyLossAccurateDifference(out var foundExampleTotalAlloyLossAccurateDifference);
|
||||||
|
|
||||||
|
testReport.CheckPassed(expectedExampleTotalAlloyLoss.Equals(foundTotalAlloyLoss),
|
||||||
|
TestMessage.CreateFailedMessage($"expectedExampleTotalAlloyLoss of {expectedExampleTotalAlloyLoss} " +
|
||||||
|
"does not equal " +
|
||||||
|
$"foundTotalAlloyLoss of {foundTotalAlloyLoss} "));
|
||||||
|
|
||||||
|
testReport.CheckPassed(expectedExampleWorkerCost.Equals(foundExampleWorkerCost),
|
||||||
|
TestMessage.CreateFailedMessage($"expectedExampleWorkerCost of {expectedExampleWorkerCost} " +
|
||||||
|
"does not equal " +
|
||||||
|
$"foundExampleWorkerCost of {foundExampleWorkerCost} "));
|
||||||
|
|
||||||
|
|
||||||
|
testReport.CheckPassed(expectedExampleMiningTimeCost.Equals(foundExampleMiningTimeCost),
|
||||||
|
TestMessage.CreateFailedMessage($"expectedExampleMiningTimeCost of {expectedExampleMiningTimeCost} " +
|
||||||
|
"does not equal " +
|
||||||
|
$"foundExampleMiningTimeCost of {foundExampleMiningTimeCost} "));
|
||||||
|
|
||||||
|
|
||||||
|
testReport.CheckPassed(expectedExampleTotalAlloyLossAccurate.Equals(foundExampleTotalAlloyLossAccurate),
|
||||||
|
TestMessage.CreateFailedMessage(
|
||||||
|
$"expectedExampleTotalAlloyLossAccurate of {expectedExampleTotalAlloyLossAccurate} " +
|
||||||
|
"does not equal " +
|
||||||
|
$"foundExampleTotalAlloyLossAccurate of {foundExampleTotalAlloyLossAccurate} "));
|
||||||
|
|
||||||
|
|
||||||
|
testReport.CheckPassed(expectedExampleTotalAlloyLossDifference.Equals(foundGetExampleTotalAlloyLossDifference),
|
||||||
|
TestMessage.CreateFailedMessage(
|
||||||
|
$"expectedExampleTotalAlloyLossDifference of {expectedExampleTotalAlloyLossDifference} " +
|
||||||
|
"does not equal " +
|
||||||
|
$"foundGetExampleTotalAlloyLossDifference of {foundGetExampleTotalAlloyLossDifference} "));
|
||||||
|
|
||||||
|
|
||||||
|
testReport.CheckPassed(
|
||||||
|
expectedExampleTotalAlloyLossAccurateDifference.Equals(foundExampleTotalAlloyLossAccurateDifference),
|
||||||
|
TestMessage.CreateFailedMessage(
|
||||||
|
$"expectedExampleTotalAlloyLossAccurateDifference of {expectedExampleTotalAlloyLossAccurateDifference} " +
|
||||||
|
"does not equal " +
|
||||||
|
$"foundExampleTotalAlloyLossAccurateDifference of {foundExampleTotalAlloyLossAccurateDifference} "));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace TestAutomation.Utils;
|
||||||
|
|
||||||
|
public class Test {
|
||||||
|
public string Name { get; set; } = "Name...";
|
||||||
|
public bool Result { get; set; } = true;
|
||||||
|
public IList<TestMessage> Messages { get; set; } = new List<TestMessage>();
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
namespace TestAutomation.Utils;
|
||||||
|
|
||||||
|
public class TestMessage {
|
||||||
|
public string Title { get; set; } = "Name...";
|
||||||
|
public string Description { get; set; } = "";
|
||||||
|
public string Color { get; set; } = "FFFFFF";
|
||||||
|
|
||||||
|
public static TestMessage CreateFailedMessage(string description) {
|
||||||
|
return new TestMessage { Title = "Check Failed", Description = description, Color = "FF0000" };
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
namespace TestAutomation.Utils;
|
||||||
|
|
||||||
|
public class TestReport {
|
||||||
|
private List<Test> Tests { get; } = new();
|
||||||
|
|
||||||
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||||
|
public Test CreateTest() {
|
||||||
|
var testName = new StackTrace().GetFrame(1)!.GetMethod()!.Name!;
|
||||||
|
Tests.Add(new Test { Name = testName });
|
||||||
|
return Tests.Last();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CheckPassed(bool passed, TestMessage message) {
|
||||||
|
if (passed) return;
|
||||||
|
Tests.Last().Result = false;
|
||||||
|
Tests.Last().Messages.Add(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool DidTestsPass() {
|
||||||
|
foreach (var test in Tests) {
|
||||||
|
if (test.Result) continue;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<object> GetMessages() {
|
||||||
|
if (DidTestsPass())
|
||||||
|
return new List<object> {
|
||||||
|
new {
|
||||||
|
title = "Passed",
|
||||||
|
color = int.Parse("00FF00", NumberStyles.HexNumber),
|
||||||
|
description = $"All {Tests.Count} tests passed."
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var messageList = new List<object>();
|
||||||
|
foreach (var test in Tests)
|
||||||
|
foreach (var message in test.Messages)
|
||||||
|
messageList.Add(
|
||||||
|
new {
|
||||||
|
title = message.Title,
|
||||||
|
color = int.Parse(message.Color, NumberStyles.HexNumber),
|
||||||
|
description = message.Description
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
return messageList;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
global using NUnit.Framework;
|
global using NUnit.Framework;
|
||||||
|
|
||||||
global using OpenQA.Selenium;
|
global using OpenQA.Selenium;
|
||||||
global using OpenQA.Selenium.Firefox;
|
global using OpenQA.Selenium.Firefox;
|
||||||
global using OpenQA.Selenium.Chrome;
|
global using OpenQA.Selenium.Chrome;
|
||||||
global using TestAutomation.Pages;
|
global using TestAutomation.Pages;
|
||||||
global using OpenQA.Selenium.Support.UI;
|
global using OpenQA.Selenium.Support.UI;
|
||||||
global using OpenQA.Selenium.Support;
|
global using OpenQA.Selenium.Support;
|
||||||
|
|
||||||
@@ -1,16 +1,16 @@
|
|||||||
namespace TestAutomation;
|
namespace TestAutomation.Utils;
|
||||||
|
|
||||||
public class Website {
|
public class Website {
|
||||||
public IWebDriver WebDriver { get; }
|
|
||||||
|
|
||||||
public HarassCalculatorPage HarassCalculatorPage { get; }
|
|
||||||
|
|
||||||
public Website(IWebDriver webDriver) {
|
public Website(IWebDriver webDriver) {
|
||||||
WebDriver = webDriver;
|
WebDriver = webDriver;
|
||||||
|
|
||||||
HarassCalculatorPage = new HarassCalculatorPage(this);
|
HarassCalculatorPage = new HarassCalculatorPage(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IWebDriver WebDriver { get; }
|
||||||
|
|
||||||
|
public HarassCalculatorPage HarassCalculatorPage { get; }
|
||||||
|
|
||||||
public IWebElement Find(string byId) {
|
public IWebElement Find(string byId) {
|
||||||
return WebDriver.FindElement(By.Id(byId));
|
return WebDriver.FindElement(By.Id(byId));
|
||||||
}
|
}
|
||||||
@@ -18,17 +18,17 @@ public class Website {
|
|||||||
public IList<IWebElement> FindChildren(string ofId, string tagname) {
|
public IList<IWebElement> FindChildren(string ofId, string tagname) {
|
||||||
return WebDriver.FindElements(By.CssSelector($"#{ofId} {tagname}"));
|
return WebDriver.FindElements(By.CssSelector($"#{ofId} {tagname}"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public string FindText(string byId) {
|
public string FindText(string byId) {
|
||||||
return WebDriver.FindElement(By.Id(byId)).Text;
|
return WebDriver.FindElement(By.Id(byId)).Text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public int FindInt(string byId) {
|
public int FindInt(string byId) {
|
||||||
return int.Parse(WebDriver.FindElement(By.Id(byId)).Text);
|
return int.Parse(WebDriver.FindElement(By.Id(byId)).Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public IWebElement EnterInput<T>(IWebElement element, T input) {
|
public IWebElement EnterInput<T>(IWebElement element, T input) {
|
||||||
element.Clear();
|
element.Clear();
|
||||||
element.SendKeys(input!.ToString());
|
element.SendKeys(input!.ToString());
|
||||||
@@ -36,7 +36,7 @@ public class Website {
|
|||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public IWebElement EnterInput<T>(string byId, T input) {
|
public IWebElement EnterInput<T>(string byId, T input) {
|
||||||
var element = Find(byId);
|
var element = Find(byId);
|
||||||
element.Clear();
|
element.Clear();
|
||||||
Reference in New Issue
Block a user