area); self::assertSame( ['GlobalData::get_global_variables()', 'GlobalData::set_global_variables()', 'et_pb_is_allowed()'], array_map(static fn (Call $call): string => $call->label(), $manifest->calls) ); self::assertSame([0, 2, 1], array_map(static fn (Call $call): ?int => $call->args, $manifest->calls)); self::assertSame([], $manifest->keys); self::assertSame([DiviFeature::VariableWrite], $manifest->features); } public function testWritesNeedAReleasedDivi(): void { ReleaseGate::useResolver( static fn (): ReleaseStatus => ReleaseMatrices::uniform(ReleaseState::Untested, '5.16.0') ); $this->expectException(DiviLocked::class); (new GlobalVariablesAdapter())->save([], []); } public function testWithoutDiviNobodyManagesVariables(): void { // Unit tests have no et_pb_is_allowed(): a missing Divi function never means "allowed". self::assertFalse((new GlobalVariablesAdapter())->canManage()); } /** @runInSeparateProcess */ public function testCanManageAsksTheVariablesManagerRight(): void { Functions\when('et_pb_is_allowed')->alias(static fn (string $cap): bool => $cap === 'variables_manager'); self::assertTrue((new GlobalVariablesAdapter())->canManage()); } /** @runInSeparateProcess */ public function testReadReturnsTheStoredForm(): void { $actions = ['allowedActions' => ['editLabel' => true, 'editValue' => true, 'remove' => true]]; $space = ['label' => 'Abstand', 'value' => '24px', 'order' => '1', 'status' => 'active']; $wave = ['label' => 'Welle', 'value' => 'linear-gradient(#fff,#000)', 'order' => '1', 'status' => 'active']; Mockery::mock('alias:' . self::GLOBAL_DATA)->allows('get_global_variables')->andReturn([ 'numbers' => (object) ['gvid-space00001' => $space + $actions], 'strings' => (object) [], 'colors' => (object) ['gcid-x' => ['label' => 'X'] + $actions], 'fonts' => (object) [ '--et_global_heading_font' => ['label' => 'Überschrift', 'value' => 'Open Sans'] + $actions, 'gvid-font000001' => (object) (['label' => 'Fließtext', 'value' => 'Inter'] + $actions), ], 'gradients' => (object) ['gvid-wave000001' => $wave + $actions], ]); self::assertSame( [ 'numbers' => ['gvid-space00001' => $space], 'fonts' => ['gvid-font000001' => ['label' => 'Fließtext', 'value' => 'Inter']], 'gradients' => ['gvid-wave000001' => $wave], ], (new GlobalVariablesAdapter())->read() ); } /** @runInSeparateProcess */ public function testSavePassesThePlannedInventoryAndThrowsOnARefusal(): void { $data = ['numbers' => ['gvid-space00001' => ['label' => 'Abstand', 'value' => '32px']]]; $expected = ['numbers' => ['gvid-space00001' => ['label' => 'Abstand', 'value' => '24px']]]; Mockery::mock('alias:' . self::GLOBAL_DATA)->expects('set_global_variables')->twice()->with($data, $expected) ->andReturn(null, new WP_Error('global_variables_stale', 'Global variables changed.')); (new GlobalVariablesAdapter())->save($data, $expected); $this->expectException(RuntimeException::class); $this->expectExceptionMessage('global variables refused: global_variables_stale Global variables changed.'); (new GlobalVariablesAdapter())->save($data, $expected); } }