Skip to content

Commit

Permalink
add account import tests
Browse files Browse the repository at this point in the history
  • Loading branch information
bratkartoffel committed Feb 25, 2023
1 parent cadad28 commit c2e0ec7
Show file tree
Hide file tree
Showing 11 changed files with 167 additions and 7 deletions.
13 changes: 12 additions & 1 deletion actions/admin_benutzer.php
Original file line number Diff line number Diff line change
Expand Up @@ -204,14 +204,25 @@ function loadAndVerifyFromExport(ZipArchive $zip, string $name, bool $verify): ?
$new_id = getOrDefault($_POST, 'new_id', false);
$ignore_round = getOrDefault($_POST, 'ignore_round', false);
$with_logs = getOrDefault($_POST, 'with_logs', false);
$ignore_metadata = getOrDefault($_POST, 'ignore_metadata', false);

if ($ignore_metadata) {
$ignore_round = true;
$verify = false;
}

$zip = new ZipArchive();
if ($zip->open($_FILES['import']['tmp_name']) !== true) {
redirectTo('/?p=admin_benutzer_importieren', 174, __LINE__);
}

// load metadata
$metadata = loadAndVerifyFromExport($zip, 'metadata.json', $verify);
if ($ignore_metadata) {
$user = loadAndVerifyFromExport($zip, 'mitglieder.json', $verify);
$metadata = array('user_id' => intval($user[0]['ID']));
} else {
$metadata = loadAndVerifyFromExport($zip, 'metadata.json', $verify);
}

// verify round
if (!$ignore_round && $metadata['round_start'] !== formatDateTime(Config::getInt(Config::SECTION_DBCONF, 'roundstart'))) {
Expand Down
14 changes: 11 additions & 3 deletions pages/admin_benutzer_importieren.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,14 @@
<li><em>Runde ignorieren:</em> Ist diese Option nicht aktiv, so lässt sich ein Export nur in der selben Runde wieder
einspielen.
</li>
<li><em>Metadata ignorieren:</em> Ältere Exporte enthalten noch keine <code>metadata.json</code> und können somit
nicht direkt importiert werden. Mit dieser Option wird diese Voraussetzung gelockert, so dass auch ältere
Exporte importiert werden können.
</li>
</ul>

<div class="form AdminImportUser">
<form action="/actions/admin_benutzer.php" method="post" enctype="multipart/form-data">
<form action="/actions/admin_benutzer.php" method="post" enctype="multipart/form-data" name="gdpr_import" id="gdpr_import">
<input type="hidden" name="a" value="6"/>
<input type="hidden" name="token" value="<?= $_SESSION['blm_xsrf_token']; ?>"/>
<header>Benutzer importieren</header>
Expand All @@ -57,11 +61,15 @@
<input type="checkbox" name="with_logs" value="1" id="with_logs"/>
</div>
<div>
<input type="submit" value="Importieren"/>
<label for="ignore_metadata">Metadata ignorieren?</label>
<input type="checkbox" name="ignore_metadata" value="1" id="ignore_metadata"/>
</div>
<div>
<input type="submit" value="Importieren" id="do_import"/>
</div>
</form>
</div>

<p>
<a href="/?p=admin">&lt;&lt; Zurück</a>
<a href="/?p=admin_benutzer" id="link_back">&lt;&lt; Zurück</a>
</p>
6 changes: 5 additions & 1 deletion styles/admin.css
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,8 @@ div.AdminEditUser {
div.AdminEditUser,
div.AdminEditGroup {
margin: 5px;
}
}

div.AdminImportUser label {
width: 250px;
}
2 changes: 1 addition & 1 deletion styles/admin.css.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion styles/admin.min.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions tests/src/test/java/eu/fraho/blm2/st/AbstractTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,14 @@ protected void selectByValue(By by, String value) {
}
}

protected void setCheckbox(By by, boolean state) {
WebDriver driver = getDriver();
WebElement element = driver.findElement(by);
if (element.isSelected() != state) {
element.click();
}
}

protected void resetPlayer(int id, TestInfo testInfo) {
resetPlayer(id, testInfo, null);
}
Expand Down Expand Up @@ -223,6 +231,7 @@ protected void runCronjob() {
}

protected static HttpResponse<String> simpleHttpGet(String url) throws IOException, InterruptedException {
log.info("Calling {}", url);
return httpClient.send(
HttpRequest.newBuilder().GET().uri(URI.create(url)).build(),
HttpResponse.BodyHandlers.ofString()
Expand Down
114 changes: 114 additions & 0 deletions tests/src/test/java/eu/fraho/blm2/st/AdminTests.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
/*
* MIT Licence
* Copyright (c) 2023 Simon Frankenberger
*
* Please see LICENCE.md for complete licence text.
*/
package eu.fraho.blm2.st;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

import java.io.File;
import java.util.Objects;

public class AdminTests extends AbstractTest {
private final int userId = getNextUserId();

@BeforeEach
void beforeEach(TestInfo testInfo) {
resetPlayer(userId, testInfo);
login("test" + userId);
}

@Test
void testImportLegacyUser() {
WebDriver driver = getDriver();
File importfile = new File(Objects.requireNonNull(AdminTests.class.getResource("/export_test-import-no-metadata.zip")).getFile());

driver.findElement(By.id("link_admin")).click();
driver.findElement(By.id("link_admin_benutzer")).click();
driver.findElement(By.id("link_admin_benutzer_importieren")).click();

setCheckbox(By.id("verify"), true);
setCheckbox(By.id("new_id"), false);
setCheckbox(By.id("ignore_round"), true);
setCheckbox(By.id("with_logs"), false);
setCheckbox(By.id("ignore_metadata"), true);
driver.findElement(By.id("import")).sendKeys(importfile.toString());
driver.findElement(By.id("do_import")).click();
assertElementPresent(By.id("meldung_249"));

driver.get("http://%s/?p=profil&id=5".formatted(LOCALHOST));
assertElementPresent(By.id("profile_5"));
}

@Test
void testImportLegacyUserNewId() {
WebDriver driver = getDriver();
File importfile = new File(Objects.requireNonNull(AdminTests.class.getResource("/export_test-import-no-metadata.zip")).getFile());

driver.findElement(By.id("link_admin")).click();
driver.findElement(By.id("link_admin_benutzer")).click();
driver.findElement(By.id("link_admin_benutzer_importieren")).click();

setCheckbox(By.id("verify"), true);
setCheckbox(By.id("new_id"), true);
setCheckbox(By.id("ignore_round"), true);
setCheckbox(By.id("with_logs"), false);
setCheckbox(By.id("ignore_metadata"), true);
driver.findElement(By.id("import")).sendKeys(importfile.toString());
driver.findElement(By.id("do_import")).click();
assertElementPresent(By.id("meldung_249"));

driver.get("http://%s/?p=profil&id=5".formatted(LOCALHOST));
assertElementPresent(By.id("meldung_154"));
}

@Test
void testImportUser() {
WebDriver driver = getDriver();
File importfile = new File(Objects.requireNonNull(AdminTests.class.getResource("/export_test-import.zip")).getFile());

driver.findElement(By.id("link_admin")).click();
driver.findElement(By.id("link_admin_benutzer")).click();
driver.findElement(By.id("link_admin_benutzer_importieren")).click();

setCheckbox(By.id("verify"), true);
setCheckbox(By.id("new_id"), false);
setCheckbox(By.id("ignore_round"), true);
setCheckbox(By.id("with_logs"), false);
setCheckbox(By.id("ignore_metadata"), false);
driver.findElement(By.id("import")).sendKeys(importfile.toString());
driver.findElement(By.id("do_import")).click();
assertElementPresent(By.id("meldung_249"));

driver.get("http://%s/?p=profil&id=5".formatted(LOCALHOST));
assertElementPresent(By.id("profile_5"));
}

@Test
void testImportUserAltered() {
WebDriver driver = getDriver();
File importfile = new File(Objects.requireNonNull(AdminTests.class.getResource("/export_test-import-altered.zip")).getFile());

driver.findElement(By.id("link_admin")).click();
driver.findElement(By.id("link_admin_benutzer")).click();
driver.findElement(By.id("link_admin_benutzer_importieren")).click();

setCheckbox(By.id("verify"), true);
setCheckbox(By.id("new_id"), false);
setCheckbox(By.id("ignore_round"), true);
setCheckbox(By.id("with_logs"), false);
setCheckbox(By.id("ignore_metadata"), false);
driver.findElement(By.id("import")).sendKeys(importfile.toString());
driver.findElement(By.id("do_import")).click();
assertElementPresent(By.id("meldung_176"));

driver.get("http://%s/?p=profil&id=5".formatted(LOCALHOST));
assertElementPresent(By.id("meldung_154"));
}
}
Binary file not shown.
Binary file not shown.
Binary file added tests/src/test/resources/export_test-import.zip
Binary file not shown.
14 changes: 14 additions & 0 deletions tests/src/test/resources/test-reset-player.php
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,20 @@
}
break;

case 'AdminTests':
Database::getInstance()->updateTableEntry(Database::TABLE_USERS, $id, array('Admin' => 1));

if (substr($testMethod, 0, 10) === 'testImport') {
// delete all other accounts
$players = Database::getInstance()->getAllPlayerIdsAndName();
foreach ($players as $player) {
if ($player['ID'] != $id && $player['Name'] !== 'admin') {
deleteAccount($player['ID']);
}
}
}
break;

default:
error_log('unknown class given: ' . $testClass);
}
Expand Down

0 comments on commit c2e0ec7

Please sign in to comment.