aboutsummaryrefslogtreecommitdiffstats
path: root/tests/unit/Module/MagicTest.php
blob: 4a03d9d578145e18c9be695b2fc6fb9cde076900 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
/**
 * Tests for the Magic module
 *
 * SPDX-FileCopyrightText: 2024 Hubzilla Community
 * SPDX-FileContributor: Harald Eilertsen
 *
 * SPDX-License-Identifier: MIT
 */

namespace Zotlabs\Tests\Unit\Module;

use PHPUnit\Framework\Attributes\BackupStaticProperties;
use Zotlabs\Module\Magic;
use App;

class MagicTest extends TestCase {

	public function test_init_with_no_args(): void {

		// We expect the request to end with a status 400, as we do not
		// pass any of the required params.
		//
		// To catch that, we have to mock the call to `http_status_exit`
		// made by the code under test.
		$this->getFunctionMock('Zotlabs\Module', 'http_status_exit')
			->expects($this->once())			// Expect the function to be called only once!
			->with(								// ... with the following two arguments
				$this->identicalTo(400),
				$this->identicalTo('Bad Request')
			)
			->willReturnCallback(function () {	// Run this function instead when called
				throw new KillmeException;		// Throw an exception to terminate processing
			});

		// Tell the test system we excpect this exception to be thrown
		$this->expectException(KillmeException::class);

		$this->get('magic');
	}

	#[BackupStaticProperties(App::class)]
	public function test_local_request_without_delegate(): void {
		$baseurl = 'https://hubzilla.test';
		$dest_url = $baseurl . '/channel/testuser';

		App::set_baseurl($baseurl);

		App::$observer = [
			'xchan_hash' => 'the hash',
		];

		// We pass a local URL, and have a valid observer, but as the
		// delegate param is not passed, nothing will be done except
		// redirecting to the passed dest url.
		//
		// This should probably return a 400 Invalid Request instead.
		$this->expectRedirectTo($dest_url);

		$this->get('magic', [ 'bdest' => bin2hex($dest_url) ]);
	}

	#[BackupStaticProperties(App::class)]
	public function test_delegate_request_switches_channel_when_allowed(): void {
		$baseurl = 'https://hubzilla.test';
		$dest_url = $baseurl . '/channel/testuser';

		// Set the stage:
		// Populate the global static App class with necessary values for the
		// code under test
		App::set_baseurl($baseurl);
		App::$timezone = 'UTC';

		// Simulate a foreign (to this hub) observer,
		App::$observer = [
			'xchan_hash' => 'foreign hash',
		];

		// Create the channel the foreign observer wants to access
		$result = create_identity([
			'account_id' => $this->fixtures['account'][0]['account_id'],
			'nickname' => 'testuser',
			'name' => 'Trish Testuser',
		]);

		// Shortcut the permission checks, by saying this observer is allowed
		// the delegate privilege over the target channel
		insert_hook('perm_is_allowed', function (array &$perm) {
			$perm['result'] = true;
		});

		// Add some dummy session data, so we can check that it's being
		// pushed to the delegate session.
		$original_session = [
			'data' => 'Just some test session data',
		];

		$_SESSION = $original_session;

		// Handle redirects manually, since we want to be able to check some
		// assertions after the redirect is thrown.
		$this->stub_goaway();

		try {
			// Send a request to get delegate privileges for the `testuser` channel
			// on the local hub.
			$this->get('magic', [
				'bdest' => bin2hex($dest_url),
				'delegate' => 'testuser@hubzilla.test']
			);
		} catch (RedirectException $e) {
			$this->assertEquals($dest_url, $e->getMessage());
			$this->assertEquals($result['channel']['channel_id'], App::$channel['channel_id']);
			$this->assertEquals($original_session, $_SESSION['delegate_push']);
			$this->assertEquals($result['channel']['channel_id'], $_SESSION['delegate_channel']);
			$this->assertEquals('foreign hash', $_SESSION['delegate']);
			$this->assertEquals($this->fixtures['account'][0]['account_id'], $_SESSION['account_id']);
		}
	}
}