mirror of
https://github.com/OPSnet/Gazelle.git
synced 2026-07-14 02:01:31 -04:00
183 lines
10 KiB
PHP
183 lines
10 KiB
PHP
<?php
|
||
|
||
use \PHPUnit\Framework\TestCase;
|
||
|
||
require_once(__DIR__ . '/../../lib/bootstrap.php');
|
||
|
||
class RequestTest extends TestCase {
|
||
protected Gazelle\Manager\Request $requestMan;
|
||
protected Gazelle\Request $request;
|
||
|
||
public function setUp(): void {
|
||
$this->requestMan = new Gazelle\Manager\Request;
|
||
}
|
||
|
||
public function tearDown(): void {
|
||
if (isset($this->request)) {
|
||
$this->request->remove();
|
||
}
|
||
// TODO: Make it easier to reset user upload/download
|
||
Gazelle\DB::DB()->prepared_query("
|
||
UPDATE users_leech_stats SET Uploaded = ? WHERE UserID = ?
|
||
", STARTING_UPLOAD, (new Gazelle\Manager\User)->find('@user')->id()
|
||
);
|
||
}
|
||
|
||
public function testCreate(): void {
|
||
$userMan = new Gazelle\Manager\User;
|
||
$admin = $userMan->find('@admin');
|
||
$user = $userMan->find('@user');
|
||
$title = 'The ' . randomString(6). ' Test Sessions';
|
||
|
||
$statsMan = new Gazelle\Stats\Users;
|
||
$statsMan->refresh();
|
||
$before = [
|
||
'created-size' => $admin->stats()->requestCreatedSize(),
|
||
'created-total' => $admin->stats()->requestCreatedTotal(),
|
||
'vote-size' => $admin->stats()->requestVoteSize(),
|
||
'vote-total' => $admin->stats()->requestVoteTotal(),
|
||
'uploaded' => $admin->uploadedSize(),
|
||
];
|
||
|
||
$request = $this->requestMan->create(
|
||
userId: $admin->id(),
|
||
categoryId: 1,
|
||
year: 2018,
|
||
title: $title,
|
||
image: '',
|
||
description: 'This is a unit test description',
|
||
recordLabel: 'Unitest Artists',
|
||
catalogueNumber: 'UA-7890',
|
||
releaseType: 1,
|
||
encodingList: 'Lossless|V0 (VBR)',
|
||
formatList: 'MP3|FLAC',
|
||
mediaList: 'CD|WEB',
|
||
logCue: 'Log (100%) + Cue',
|
||
checksum: true,
|
||
oclc: '',
|
||
);
|
||
$this->assertInstanceOf(Gazelle\Request::class, $request, 'request-create');
|
||
$this->request = $request; // to allow tear down in case of error
|
||
|
||
$artistMan = new Gazelle\Manager\Artist;
|
||
$artistName = 'The ' . randomString(8);
|
||
[$artistId, $aliasId] = $artistMan->create($artistName);
|
||
$this->assertGreaterThan(0, $artistId, 'request-create-artist');
|
||
// FIXME: nuke this horrible legacy code
|
||
$artistMan->setGroupId($request->id());
|
||
$artistMan->addToRequest($artistId, $aliasId, ARTIST_MAIN);
|
||
|
||
$tagMan = new Gazelle\Manager\Tag;
|
||
$tagId = $tagMan->create('jazz', $admin->id());
|
||
$this->assertGreaterThan(0, $tagId, 'request-create-tag');
|
||
$this->assertEquals(1, $tagMan->createRequestTag($tagId, $request->id()), 'request-add-tag');
|
||
|
||
// FIXME: cannot be asserted earlier: this should not depend on a request having tags
|
||
$this->assertInstanceOf(Gazelle\ArtistRole\Request::class, $request->artistRole(), 'request-artist-role');
|
||
|
||
// Request::info() will now succeed
|
||
$this->assertEquals(1, $request->userId(), 'request-user-id');
|
||
$this->assertEquals(1, $request->ajaxInfo()['requestorId'], 'request-ajax-user-id');
|
||
$this->assertEquals("$artistName – $title [2018]", $request->text(), 'request-text');
|
||
|
||
$this->assertEquals(1, $request->releaseType(), 'request-release-type-id');
|
||
$this->assertEquals('Album', $request->releaseTypeName(), 'request-release-type-name');
|
||
$this->assertEquals(0, $request->fillerId(), 'request-unfilled-filler-id');
|
||
$this->assertEquals(0, $request->torrentId(), 'request-unfilled-torrent-id');
|
||
$this->assertNull($request->fillDate(), 'request-unfilled-date');
|
||
$this->assertNull($request->tgroupId(), 'request-no-tgroup');
|
||
$this->assertEquals('UA-7890', $request->catalogueNumber(), 'request-can-no');
|
||
$this->assertEquals('Unitest Artists', $request->recordLabel(), 'request-rec-label');
|
||
$this->assertEquals(1, $request->categoryId(), 'request-cat-id');
|
||
$this->assertEquals('Music', $request->categoryName(), 'request-cat-name');
|
||
$this->assertEquals(['jazz'], $request->tagNameList(), 'request-tag-list');
|
||
$this->assertEquals('This is a unit test description', $request->description(), 'request-description');
|
||
$this->assertTrue($request->needCue(), 'request-need-cue');
|
||
$this->assertTrue($request->needLog(), 'request-need-log');
|
||
$this->assertTrue($request->needLogChecksum(), 'request-need-checksum');
|
||
$this->assertEquals(100, $request->needLogScore(), 'request-log-score');
|
||
$this->assertEquals('Log (100%) + Cue', $request->descriptionLogCue(), 'request-descn-log-cue');
|
||
|
||
$this->assertEquals(['Lossless', 'V0 (VBR)'], array_values($request->currentEncoding()), 'request-cur-encoding');
|
||
$this->assertEquals(['Lossless', 'V0 (VBR)'], array_values($request->needEncodingList()), 'request-need-encoding');
|
||
$this->assertEquals('Lossless, V0 (VBR)', $request->descriptionEncoding(), 'request-descr-encoding');
|
||
$this->assertEquals('Lossless|V0 (VBR)', $request->legacyEncodingList(), 'request-legacy-encoding');
|
||
$this->assertTrue($request->needEncoding('Lossless'), 'request-need-encoding-lossless');
|
||
$this->assertFalse($request->needEncoding('24bit Lossless'), 'request-need-encoding-24bit');
|
||
$this->assertNotEquals(ENCODING, $request->currentEncoding(), 'request-encoding-specified');
|
||
|
||
$this->assertEquals(['MP3', 'FLAC'], $request->currentFormat(), 'request-cur-format');
|
||
$this->assertEquals(['MP3', 'FLAC'], $request->needFormatList(), 'request-list-format');
|
||
$this->assertEquals('MP3, FLAC', $request->descriptionFormat(), 'request-descr-format');
|
||
$this->assertEquals('MP3|FLAC', $request->legacyFormatList(), 'request-legacy-format');
|
||
$this->assertTrue($request->needFormat('FLAC'), 'request-need-format-flac');
|
||
$this->assertFalse($request->needFormat('AAC'), 'request-need-format-aac');
|
||
$this->assertNotEquals(FORMAT, $request->currentFormat(), 'request-format-specified');
|
||
|
||
$this->assertEquals(['CD', 'WEB'], $request->currentMedia(), 'request-cur-media');
|
||
$this->assertEquals(['CD', 'WEB'], $request->needMediaList(), 'request-list-media');
|
||
$this->assertEquals('CD, WEB', $request->descriptionMedia(), 'request-descr-media');
|
||
$this->assertEquals('CD|WEB', $request->legacyMediaList(), 'request-legacy-media');
|
||
$this->assertTrue($request->needMedia('CD'), 'request-need-media-cd');
|
||
$this->assertFalse($request->needMedia('DVD'), 'request-need-media-DVD');
|
||
$this->assertNotEquals(MEDIA, $request->currentMedia(), 'request-media-specified');
|
||
|
||
$this->assertTrue($request->canVote($admin), 'request-vote-owner');
|
||
$this->assertTrue($request->canVote($user), 'request-vote-other');
|
||
$this->assertTrue($request->canEditOwn($admin), 'request-edit-own-owner');
|
||
$this->assertTrue($request->canEdit($admin), 'request-edit-owner');
|
||
$this->assertFalse($request->canEditOwn($user), 'request-edit-own-other');
|
||
$this->assertFalse($request->canEdit($user), 'request-edit-other');
|
||
|
||
// Initial vote from creator
|
||
$bounty = 1024**2 * REQUEST_MIN;
|
||
$this->assertTrue($request->vote($admin, $bounty), 'request-initial-bounty');
|
||
|
||
$statsMan->refresh();
|
||
$admin->flush();
|
||
$after = [
|
||
'created-size' => $admin->stats()->requestCreatedSize(),
|
||
'created-total' => $admin->stats()->requestCreatedTotal(),
|
||
'vote-size' => $admin->stats()->requestVoteSize(),
|
||
'vote-total' => $admin->stats()->requestVoteTotal(),
|
||
'uploaded' => $admin->uploadedSize(),
|
||
];
|
||
|
||
$taxedBounty = (int)($bounty * (1 - REQUEST_TAX));
|
||
// $this->assertEquals(1 + $before['created-total'], $after['created-total'], 'request-created-total');
|
||
// $this->assertEquals(1 + $before['vote-total'], $after['vote-total'], 'request-vote-total');
|
||
// $this->assertEquals($taxedBounty, $after['created-size'] - $before['created-size'], 'request-created-size');
|
||
// $this->assertEquals($taxedBounty, $after['vote-size'] - $before['vote-size'], 'request-vote-size');
|
||
$this->assertEquals(-$bounty, $after['uploaded'] - $before['uploaded'], 'request-subtract-bounty');
|
||
|
||
$this->assertEquals([$admin->id()], array_column($request->userIdVoteList(), 'user_id'), 'request-user-id-vote-list');
|
||
$this->assertEquals($taxedBounty, $request->userBounty($admin->id()), 'request-user-bounty-total');
|
||
|
||
// add some bounty
|
||
$this->assertTrue($request->vote($user, $bounty), 'request-more-bounty');
|
||
$this->assertEquals(2, $request->userVotedTotal(), 'request-total-voted');
|
||
$this->assertEquals(2 * $taxedBounty, $request->bountyTotal(), 'request-total-bounty-added');
|
||
|
||
// find a torrent to fill the request
|
||
$fillBefore = [
|
||
'uploaded' => $user->uploadedSize(),
|
||
'bounty-size' => $user->stats()->requestBountySize(),
|
||
'bounty-total' => $user->stats()->requestBountyTotal(),
|
||
];
|
||
$torrentId = (int)Gazelle\DB::DB()->scalar("SELECT min(ID) FROM torrents");
|
||
$torrent = (new Gazelle\Manager\Torrent)->findById($torrentId);
|
||
$this->assertInstanceOf(Gazelle\Torrent::class, $torrent, 'request-torrent-filler');
|
||
$this->assertEquals(1, $request->fill($user, $torrent), 'request-fill');
|
||
$this->assertEquals($fillBefore['bounty-size'] + $taxedBounty * 2, $user->stats()->requestBountySize(), 'request-fill-receive-bounty');
|
||
$this->assertEquals($fillBefore['bounty-total'] + 1, $user->stats()->requestBountyTotal(), 'request-fill-receive-total');
|
||
|
||
// and now unfill it
|
||
$this->assertEquals(1, $request->unfill($admin, 'unfill unittest', new Gazelle\Manager\Torrent), 'request-unfill');
|
||
$this->assertEquals($fillBefore['uploaded'], $user->flush()->uploadedSize(), 'request-fill-unfill-user');
|
||
$this->assertEquals($fillBefore['bounty-total'], $user->stats()->requestBountyTotal(), 'request-fill-unfill-total');
|
||
|
||
$this->assertTrue($request->remove(), 'request-remove');
|
||
unset($this->request); // success, no need to tidy up
|
||
}
|
||
}
|