insert()->execute([ 'post_id' => 7, 'tree_rev' => $this->treeRev(), 'after' => 's0.r0.c1.m1', 'nodes' => [['type' => 'text', 'content' => '
Neu
']], ]); self::assertTrue($result['ok'], (string) json_encode($result)); self::assertCount(1, $this->saved); self::assertSame([['id' => 's0.r0.c1.m2', 'type' => 'divi/text', 'action' => 'inserted', 'label' => 'Hero – Text']], $result['changed']); self::assertSame(Rev::of($this->saved[0]), $result['tree_rev']); self::assertSame(Rev::ofPost($this->post), $result['rev']); self::assertSame(811, $result['revision_id']); self::assertArrayNotHasKey('restore_url', $result, 'pages: lit/revision-restore'); self::assertSame(4711, $result['log_id']); self::assertStringStartsWith('s0 section "Hero"', (string) $result['outline']); self::assertSame('https://kunde.test/?page_id=7&et_fb=1', $result['edit_url']); // Byte identity: only the new block was added, every other byte is unchanged. $inserted = ''; self::assertSame(str_replace('' . $inserted . '', $this->saved[0]); self::assertSame('s0', $result['changed'][0]['id']); self::assertSame('Start', $result['changed'][0]['label']); } /** Ruling S40: the S38 overlap rule for new nodes too. */ public function testInsertRefusesShortFormAndAttrsOnTheSamePath(): void { $result = $this->insert()->execute([ 'post_id' => 7, 'tree_rev' => $this->treeRev(), 'parent' => 's0.r0.c1', 'nodes' => [[ 'type' => 'button', 'text' => 'Neu', 'attrs' => ['button.innerContent' => ['desktop' => ['linkUrl' => '/neu']]], ]], ]); self::assertToolError($result, 'validation_failed'); self::assertArrayHasKey('nodes[0].attrs.button.innerContent', self::clientError($result)['fields']); self::assertSame([], $this->saved); } }