user = Helper::makeUser('torrent.' . randomString(10), 'rent', clearInbox: true); $this->user->requestContext()->setViewer($this->user); $this->torrent = Helper::makeTorrentMusic( tgroup: Helper::makeTGroupMusic( name: 'phpunit torrent ' . randomString(6), artistName: [[ARTIST_MAIN], ['phpunit torrent ' . randomString(12)]], tagName: ['jazz'], user: $this->user, ), user: $this->user, title: randomString(10), ); } public function tearDown(): void { Helper::removeTGroup($this->torrent->group(), $this->user); $this->user->remove(); if (isset($this->userList)) { foreach ($this->userList as $user) { $user->remove(); } } } public function testFlag(): void { $this->assertFalse( $this->torrent->hasFlag(TorrentFlag::badFile), 'torrent-no-bad-file-flag', ); $this->assertEquals( 1, $this->torrent->addFlag(TorrentFlag::badFile, $this->user), 'torrent-add-bad-file-flag', ); $this->assertTrue( $this->torrent->hasFlag(TorrentFlag::badFile), 'torrent-has-bad-file-flag', ); $this->assertEquals( 1, $this->torrent->removeFlag(TorrentFlag::badFile, $this->user), 'torrent-remove-bad-file-flag', ); $this->assertEquals( 0, $this->torrent->removeFlag(TorrentFlag::badFolder, $this->user), 'torrent-remove-no-flag', ); $this->assertFalse( $this->torrent->hasFlag(TorrentFlag::badFile), 'torrent-no-more-bad-file-flag', ); $log = (new Manager\SiteLog())->tgroupLogList($this->torrent->groupId()); $this->assertCount(3, $log, 'torrent-flag-log-count'); // reverse chronological, remove then add $this->assertEquals( "\"Bad Files\" flag removed from torrent {$this->torrent->id}", $log[0]['info'], 'torrent-flag-log-add', ); $this->assertEquals( "\"Bad Files\" flag added to torrent {$this->torrent->id}", $log[1]['info'], 'torrent-flag-log-add', ); } public function testContents(): void { $bencoder = new \OrpheusNET\BencodeTorrent\BencodeTorrent(); $bencoder->decodeFile(__DIR__ . '/../fixture/valid_torrent.torrent'); $info = $bencoder->getData(); $this->assertIsArray($info, 'torrent-file-data-array'); $torrentFiler = new File\Torrent(); $this->assertTrue( $torrentFiler->put($bencoder->getEncode(), $this->torrent->id()), 'torrent-file-put' ); $this->assertTrue( $torrentFiler->exists($this->torrent->id()), 'torrent-file-exists' ); ['total_size' => $totalSize, 'files' => $fileList] = $bencoder->getFileList(); $torMan = new Manager\Torrent(); ['path' => $filename, 'size' => $size] = $fileList[0]; $this->assertEquals( ".flac s2056192s 1 track1.flac รท", $torMan->metaFilename($filename, $size), 'torrent-file-meta-filename', ); $dbFileList = []; foreach ($fileList as ['path' => $filename, 'size' => $size]) { $dbFileList[] = $torMan->metaFilename($filename, $size); } $this->torrent->setField('FileList', implode("\n", $dbFileList)) ->modify(); $this->assertEquals( ['flac' => 2], $this->torrent->fileListPrimaryMap(), 'torrent-file-primary-map' ); $this->assertEquals( 2, $this->torrent->fileListPrimaryTotal(), 'torrent-file-primary-total' ); $this->assertEquals( 7228, $this->torrent->fileListNonPrimarySize(), 'torrent-file-non-primary-size' ); $this->assertEquals( "1 track1.flac{{{2056192}}}|||2 track2.flac{{{6152192}}}|||Test Album.log{{{7228}}}", $this->torrent->fileListLegacyAPI(), 'torrent-file-legacy-list' ); $this->assertEquals(8215612, $totalSize, 'torrent-file-total-size'); $this->assertCount(3, $fileList, 'torrent-file-list'); $this->assertTrue( $torrentFiler->remove($this->torrent->id()), 'torrent-file-remove' ); } public function testRemovalPm(): void { $torrent = Helper::makeTorrentMusic( tgroup: $this->torrent->group(), user: $this->user, title: randomString(10), ); // a downloader $this->userList['downloader'] = Helper::makeUser('torrent.' . randomString(10), 'rent', clearInbox: true); $status = new Download($torrent, new User\UserclassRateLimit($this->userList['downloader']), false); $this->assertEquals(DownloadStatus::ok, $status->status(), 'torrent-removal-download'); // a snatcher $this->userList['snatcher'] = Helper::makeUser('torrent.' . randomString(10), 'rent', clearInbox: true); Helper::generateTorrentSnatch($torrent, $this->userList['snatcher']); // a seeder $this->userList['seeder'] = Helper::makeUser('torrent.' . randomString(10), 'rent', clearInbox: true); Helper::generateTorrentSeed($torrent, $this->userList['seeder']); $name = $torrent->fullName(); $path = $torrent->path(); $this->assertEquals( 4, (new Manager\User())->sendRemovalPm( $this->user, $torrent->id(), $name, $path, log: 'phpunit removal test', replacementId: 0, pmUploader: true ), 'torrent-removal-pm' ); // uploader $inbox = $this->user->inbox(); $this->assertEquals(1, $inbox->messageTotal(), 'torrent-removal-uploader-message-count'); $list = $inbox->messageList(new Manager\PM($this->user), 2, 0); $pm = $list[0]; $this->assertStringStartsWith( "Uploaded torrent deleted: $name", $pm->subject(), 'torrent-removal-pm-subject' ); $postList = $pm->postList(1, 0); $this->assertStringStartsWith( "A torrent that you uploaded has been deleted.", $postList[0]['body'], 'torrent-removal-uploader-pm-recv-body' ); // downloader $inbox = $this->userList['downloader']->inbox(); $this->assertEquals(1, $inbox->messageTotal(), 'torrent-removal-downloader-message-count'); $list = $inbox->messageList(new Manager\PM($this->userList['downloader']), 2, 0); $pm = $list[0]; $this->assertStringStartsWith( "Downloaded torrent deleted: $name", $pm->subject(), 'torrent-removal-downloader-pm-subject' ); $postList = $pm->postList(1, 0); $this->assertStringStartsWith( "A torrent that you have downloaded has been deleted.", $postList[0]['body'], 'torrent-removal-downloader-pm-recv-body' ); // snatcher $inbox = $this->userList['snatcher']->inbox(); $this->assertEquals(1, $inbox->messageTotal(), 'torrent-removal-snatcher-message-count'); $list = $inbox->messageList(new Manager\PM($this->userList['snatcher']), 2, 0); $pm = $list[0]; $this->assertStringStartsWith( "Snatched torrent deleted: $name", $pm->subject(), 'torrent-removal-snatcher-pm-subject' ); $postList = $pm->postList(1, 0); $this->assertStringStartsWith( "A torrent that you have snatched has been deleted.", $postList[0]['body'], 'torrent-removal-snatcher-pm-recv-body' ); // seeder $inbox = $this->userList['seeder']->inbox(); $this->assertEquals(1, $inbox->messageTotal(), 'torrent-removal-seeder-message-count'); $list = $inbox->messageList(new Manager\PM($this->userList['seeder']), 2, 0); $pm = $list[0]; $this->assertStringStartsWith( "Seeded torrent deleted: $name", $pm->subject(), 'torrent-removal-seeder-pm-subject' ); $postList = $pm->postList(1, 0); $this->assertStringStartsWith( "A torrent that you were seeding has been deleted.", $postList[0]['body'], 'torrent-removal-pm-seeder-recv-body' ); } public function testFileList(): void { // create a list of files larger than 1 MiB (30 * 34 - 1 > 1024 ** 2) $count = 34; $fileList = implode( "\n", array_fill(0, $count, ".flac s1234s ABCDEFGH.flac " . FILELIST_DELIM) ); $this->torrent->setField('FileList', $fileList)->modify(); $list = $this->torrent->fileList(); $this->assertCount($count, $list, 'torrent-large-filelist'); // if things do not line up then there is an off-by-one somewhere for ($n = 0; $n < $count; $n++) { $this->assertEquals('ABCDEFGH.flac', $list[$n]['name'], "torrent-filelist-name-$n"); $this->assertEquals('.flac', $list[$n]['ext'], "torrent-filelist-ext-$n"); $this->assertEquals(1234, $list[$n]['size'], "torrent-filelist-size-$n"); } } public function testRemoveAllLogs(): void { $this->assertEquals( 0, $this->torrent->removeAllLogs( $this->user, new File\RipLog(), new File\RipLogHTML(), ), 'torrent-remove-all-logs' ); } public function testTorrentBBCode(): void { $torrentId = $this->torrent->id(); $tgroupId = $this->torrent->group()->id(); $torrentRegexp = "^.* โ€“ .* \[\d+ .*?\]"; $this->assertMatchesRegularExpression("@{$torrentRegexp} .*$@", \Text::full_format("[pl]{$torrentId}[/pl]"), 'text-pl' ); // FIXME: we generate torrent urls in two different ways $torrentRegexp = "^.* โ€“ .* \[\d+ .*?\]"; $this->assertMatchesRegularExpression("@{$torrentRegexp}@", \Text::full_format(SITE_URL . "/{$this->torrent->location()}"), "text-torrent-url tg={$tgroupId} t={$torrentId}" ); $tgroupRegexp = ".*? โ€“ .*? \[\d+ \S+\]"; $this->assertMatchesRegularExpression("@{$tgroupRegexp}@", \Text::full_format("[torrent]{$tgroupId}[/torrent]"), 'text-tgroup-id' ); $this->assertMatchesRegularExpression("@{$tgroupRegexp}@", \Text::full_format(SITE_URL . "/{$this->torrent->group()->location()}"), 'text-tgroup-url' ); } public function testTorrentCollector(): void { $title = 'phpunit-zip'; $collector = new Collector\TList($this->user, new Manager\Torrent(), $title, 0); $userTorrent = new Search\UserTorrent($this->user, UserTorrentSearch::uploaded); $this->assertCount(1, $userTorrent->idList(), 'torrent-search-upload'); $collector->setList($userTorrent->idList()); $this->assertTrue($collector->prepare([]), 'collect-tlist-prepare'); $zip = Util\Zip::make($title); $this->assertInstanceOf(\ZipStream\ZipStream::class, $zip, 'collect-zipper'); $this->assertEquals(1, $collector->fillZip($zip), 'collect-tlist-fill'); $this->assertStringContainsString( "Torrent groups scanned: 1\n", $collector->summary(), "collector-tlist-summary", ); } }