Beta phase evaluation

Reference: https://www.drupal.org/core/beta-changes
Issue category Task because not fixing bugs, only improving maintainability.
Issue priority Critical because blocks #2429257: Bubble cache contexts, which is a critical performance issue.
Unfrozen changes Unfrozen because it only changes tests.
Disruption Zero disruption.

Problem/Motivation

Drupal\system\Tests\Common\RenderTest uses KernelTestBase.

Since #2346937: Implement a Renderer service; reduces drupal_render / _theme service container calls, it can be converted to PHPUnit tests.

Proposed resolution

Convert to PHPUnit tests

Remaining tasks

TBD.

User interface changes

None.

API changes

None.

Support from Acquia helps fund testing for Drupal Acquia logo

Comments

Wim Leers’s picture

Now unblocked :)

Wim Leers’s picture

Title: Convert existing drupal_render tests to UnitTests » Convert existing drupal_render() KernelTestBase tests to PHPUnit tests
Issue summary: View changes
Issue tags: +Novice, +php-novice
dawehner’s picture

FileSize
8.17 KB

@zealfire asked in IRC, so here is a first example of a conversion.

It converts the existing RendererTest::testDrupalRenderSorting() test into two test methods. (see, that is pretty much c&p)
So c&p the existing test method, replace drupal_render() with $this->renderer->render() and hope it works :) Don't even try to convert
the ones which deals with cache atm., they neeed some work.

The other functions though seems to be less simple.

daffie’s picture

Status: Active » Needs review

For the testbot.

tadityar’s picture

@dawehner is this part of a META?

dawehner’s picture

@dawehner is this part of a META?

Not that I know of.

dawehner’s picture

But just to be clear, there is a lot to do, in order to be able to convert all those existing tests.

dawehner’s picture

Issue tags: +Security
FileSize
26.58 KB
19.55 KB

As its turns out access_callback is broken.

Here is some more conversion ... far from being finished. The case with #cache still needs to wait, obviously.

dawehner’s picture

FileSize
35.26 KB
14.12 KB

Alright, its converted as much I think we can convert it for now.

Wim Leers’s picture

dawehner’s picture

We clearly have tests which are integration level tests, because they test both the theme manager and the renderer at the same time.

dawehner’s picture

FileSize
72.03 KB
38.61 KB

Rebase + Just continued with some more conversions.

@Wim Leers
Added some bugfixes to the renderer.

Status: Needs review » Needs work

The last submitted patch, 12: 2378883-12.patch, failed testing.

Wim Leers’s picture

FileSize
71.99 KB
8.54 KB

Reviewed the code and reviewed the porting of only the testDrupalRenderBasics() test. Attached is a reroll that already fixes all nitpicks and slightly improves some comments, to better convey which tests cases form logical groups, hence making it more doable to compare the old test with the new test; otherwise it's hard to guarantee that I didn't overlook something.


  1. +++ b/core/lib/Drupal/Core/Render/Renderer.php
    @@ -311,7 +311,7 @@ protected function doRender(&$elements, $is_root_call = FALSE) {
    -    if (isset($elements['#cache'])) {
    +    if (isset($elements['#cache']) && $elements['#cache'] !== ['tags' => []]) {
    

    I've long considered adding this optimization also. +1 to this.

    Perhaps update the preceding comment, from if #cache is set to if caching is enabled

  2. +++ b/core/lib/Drupal/Core/Render/Renderer.php
    @@ -142,7 +142,7 @@ public function render(&$elements, $is_root_call = FALSE) {
    -      if (is_string($elements['#access_callback']) && strpos($elements['#access_callback'], '::') === FALSE) {
    +      if (is_string($elements['#access_callback']) && strpos($elements['#access_callback'], '::') !== FALSE) {
    
    @@ -197,7 +197,7 @@ protected function doRender(&$elements, $is_root_call = FALSE) {
    -        if (is_string($callable) && strpos($callable, '::') === FALSE) {
    +        if (is_string($callable) && strpos($callable, '::') !== FALSE) {
    
    @@ -457,7 +457,7 @@ protected function processPostRenderCache(array &$elements) {
    -        if (strpos($callback, '::') === FALSE) {
    +        if (strpos($callback, '::') !== FALSE) {
    

    These changes are wrong.

    Run this little test script to convince yourself:

    
    $callbacks = [
      'service:method',
      'class::method',
    ];
    foreach ($callbacks as $callback) {
      print 'Controller resolver needs to be called?' . "\n";
      var_dump(strpos($callback, '::') === FALSE);
    }
    
  3. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1131 @@
    +    if (isset($setup_code)) {
    +      $setup_code = $setup_code->bindTo($this);
    +      $setup_code();
    +    }
    

    Wow. Never seen this before! Suddenly I understand why you like this issue so much :)

    A bit of documentation would help though. What about: Optionally, a closure can be provided that makes the necessary preparations to test the provided case. We bind the closure to $this, to make it run as if the mocks it creates were created right here.

  4. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1131 @@
    +    $setup_code_type_link = function() {
    

    Why the "link" part in this variable name? It makes sense in the next one, but not here.

  5. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1131 @@
    +      '#url' => 'http://drupal.org',
    ...
    +      '#url' => 'http://drupal.org',
    

    The deleted code said Url::fromUri('http:/drupal.org').

    Why this change?

  6. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1131 @@
    +  public function testRenderWithPresetAccess($access) {
    ...
    +  public function testRenderWithAccessPropertyAndCallback($access) {
    

    "Preset" vs "Property"; let's standardize on "Property"

  7. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1131 @@
    +  public function testRenderWithAccessCallbackCallable($access) {
    

    "AccessCallbackCallable" seems a bit much, why isn't just "AccessCallback" sufficient?

  8. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1131 @@
    +  protected function setupThemeContainer($matcher = NULL) {
    +    $this->themeManager->expects($matcher ?: $this->at(1))
    

    Clever!

dawehner’s picture

Thank you for your quick review!

These changes are wrong.

I am a bit confused. Let's take one example from the patch:

-      if (is_string($elements['#access_callback']) && strpos($elements['#access_callback'], '::') === FALSE) {
+      if (is_string($elements['#access_callback']) && strpos($elements['#access_callback'], '::') !== FALSE) {
         $elements['#access_callback'] = $this->controllerResolver->getControllerFromDefinition($elements['#access_callback']);
       }

Let's assume we are in HEAD, and ['#acccess_callback'] is \Drupal\Core\Entity\EntityAccess::access. In that case the str_pos would find something like 20,
which is NOT === FALSE, so we have to ask the controller resolver. Please enlighten me, but afaik, we want for all those callbacks to support 'Drupal\Core\DependencyInjection\ContainerInjectionInterface' don't we?

Wow. Never seen this before! Suddenly I understand why you like this issue so much :)

Well, its sad that you have to do that, but for me this seems to be the test way to make the test somehow good readable.

Why the "link" part in this variable name? It makes sense in the next one, but not here.

Well, I probably decided to go with consistency.

The deleted code said Url::fromUri('http:/drupal.org').

Why this change?

I went with that, because the test gets easier to read with the new version. For a unit test, the rendererTest should not care about how #type link is implemented internally.

"Preset" vs "Property"; let's standardize on "Property"

sure.

"AccessCallbackCallable" seems a bit much, why isn't just "AccessCallback" sufficient?

Well, I wanted to be sure that both callable and foo::bar works.

Clever!

Well, it is clever until your test code gets hard to understand.

dawehner’s picture

Status: Needs work » Needs review

.

Status: Needs review » Needs work

The last submitted patch, 14: 2378883-14.patch, failed testing.

dawehner’s picture

Status: Needs work » Needs review
FileSize
106.54 KB
39.45 KB

Some work in the meantime.

Status: Needs review » Needs work

The last submitted patch, 18: 2378883-18.patch, failed testing.

dawehner’s picture

Status: Needs work » Needs review
FileSize
101.26 KB
19.64 KB

Did some work here.

Note: I reverted most of the changes to Renderer itself.

Regarding the last remaining failure, I don't know how this could actually pass in HEAD. if you unset #cache #post_render_cache should not be executed, right?

Status: Needs review » Needs work

The last submitted patch, 20: 2378883-20.patch, failed testing.

dawehner’s picture

Status: Needs work » Needs review
FileSize
101.44 KB
1.36 KB

Sometimes a return statement is important.

Status: Needs review » Needs work

The last submitted patch, 22: 2378883-22.patch, failed testing.

Wim Leers’s picture

Assigned: Unassigned » Wim Leers
Status: Needs work » Needs review
FileSize
1.06 KB
101.88 KB

Wow, great progress!


RE: that last failure in RendererTest:

  • HEAD: - $output = drupal_render_root($element);
  • patch: $output = $this->renderer->render($element);
  • should be: $output = $this->renderer->renderRoot($element);

:)


Now reviewing!

Wim Leers’s picture

Continuing the reviewing of tests in my next comment. Wanted to post this because otherwise the interdiff will become unwieldy.

The included interdiff shows all changes, but the topical interdiffs show the steps I took to get there.

Code changes review

  1. +++ b/core/includes/common.inc
    @@ -1366,25 +1366,7 @@ function show(&$element) {
     function drupal_render_cache_generate_placeholder($callback, array &$context) {
    

    Could use an @deprecated.

    Fixed.

  2. +++ b/core/lib/Drupal/Core/Render/Renderer.php
    @@ -344,7 +345,7 @@ protected function doRender(&$elements, $is_root_call = FALSE) {
    +    if (isset($elements['#cache']) && $elements['#cache'] !== ['tags' => []]) {
    

    Ever since #2329101: CacheableInterface only has a getCacheKeys() method, no getCacheContexts(), leads to awkward implementations, this should actually be ['contexts' => [], 'tags' => []]. But, what would be better, is if we'd instead check if either #cache['cid'] or #cache['keys'] is set. Because if either of those is set, then we *actually* want to do caching, hence that won't change in the future.

    (E.g. when max-age is added to cache metadata.)

    Fixed.

  3. +++ b/core/lib/Drupal/Core/Render/RendererInterface.php
    @@ -348,4 +348,29 @@ public static function mergeBubbleableMetadata(array $a, array $b);
    +   * This is used by drupal_pre_render_render_cache_placeholder() to generate
    +   * placeholders, but should also be called by #post_render_cache callbacks that
    +   * want to replace the placeholder with the final markup.
    

    This is only copied but it's actually wrong (it was right at one point but then wasn't updated when that #pre_render callback was removed).

    Fixed.

  4. +++ b/core/lib/Drupal/Core/Render/RendererInterface.php
    @@ -348,4 +348,29 @@ public static function mergeBubbleableMetadata(array $a, array $b);
    +  public function generateCachePlaceholder($callback, array &$context);
    

    Given #2364303: [meta] Formalize and define usage of #post_render_cache and the fact that we don't want break this API once it is introduced to minimize disruption… we might want to check with Fabianx which name makes most sense. I suspect just generatePlaceholder() will be better.

    (It's only a moving around of code, but technically this is also an API addition to this interface, as you will probably agree.)


Moved tests review

The following were not moved to the PHPUnit test:

  1. testDrupalRenderThemePreprocessAttached(): because it requires a module to be enabled
  1. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1496 @@
    +  public function testRenderBasic($build, $expected, callable $setup_code = NULL) {
    ...
    +  public function providerTestRenderBasic() {
    

    This only had code formatting nitpicks, comment nitpicks and missing @covers. Last but not least: it was very difficult to find your way through this long list of test cases, because they actually have logical/semantical grouping, but it's not clear. I added "Part X" comments in between to clarify the grouping.

    Fixed all that.

  2. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1496 @@
    +    // Basic #markup based renderable array.
    +    $data[] = [
    +      ['#markup' => 'foo']
    +    , 'foo'];
    +
    +    // Test handling of #children and child renderable elements.
    +    // #theme is not set, #children is not set and the array has children.
    +    $data[] = [
    +      [
    +        'child' => ['#markup' => 'bar'],
    +      ], 'bar'];
    +    // #theme is not set, #children is set but empty and the array has
    +    // children.
    +    $data[] = [
    +      [
    +        '#children' => '',
    +        'child' => ['#markup' => 'bar'],
    +      ], 'bar'
    +    ];
    +    // #theme is not set, #children is not empty and will be assumed to be the
    +    // rendered child elements even though the #markup for 'child' differs.
    +    $data[] = [
    +      [
    +        '#children' => 'foo',
    +        'child' => ['#markup' => 'bar'],
    +      ], 'foo'
    +    ];
    

    … the one other change to the basic tests that I made is the moving of these new (! — that's great1) test cases to the top of the test, where they have a more logical place.

    Why? The first bunch of test cases specifically test without the theme system, and so does this.

  3. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1496 @@
    +   * @covers ::render
    +   */
    +  public function testRenderSorting() {
    ...
    +   * @covers ::render
    +   */
    +  public function testRenderSortingWithSetHashSorted() {
    

    These also cover ::doRender(), same goes for every other @covers ::render; adding @covers ::doRender in all those places.

  4. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1496 @@
    +  public function testRenderWithPresetAccess($access) {
    ...
    +  public function testRenderWithAccessCallbackCallable($access) {
    ...
    +  public function testRenderWithAccessPropertyAndCallback($access) {
    ...
    +  public function testRenderWithAccessControllerResolved($access) {
    

    Cleaned these up: their matching assert method now has docs, and sets '#markup' => 'test', so that not each of these has to do that.

  5. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1496 @@
    +  public function testRenderTwice() {
    +    $build = [
    +      '#markup' => 'test',
    +    ];
    +
    +    $this->assertEquals('test', $this->renderer->render($build));
    +    // @todo This behaviour is odd ...
    +    $this->assertEquals('', $this->renderer->render($build));
    +  }
    

    This is a new test. Great.

    It's not actually that odd. The first time, #printed = TRUE is set. Hence the second time, we don't get any output.

    Updated this test accordingly.

  6. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1496 @@
    +  public function testRenderWithoutThemeArguments() {
    

    In HEAD, the "children attached" test comes before this. So I moved it back up here. It wasn't in a better (more logical) place in this patch, so we might as well keep these things in sync.

  7. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1496 @@
    +    $cache = new MemoryBackend('render');
    +    $this->cacheFactory->expects($this->any())
    +      ->method('get')
    +      ->with('render')
    +      ->willReturn($cache);
    ...
    +    $cache = new MemoryBackend('render');
    +    $this->cacheFactory->expects($this->any())
    +      ->method('get')
    +      ->willReturn($cache);
    

    In ::testRenderCache & ::testDrupalRenderChildrenAttached, these can be replaced with calls to the ::setupMemoryCache helper.

    Fixed.

  8. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1496 @@
    +  public function testDrupalRenderChildrenAttached() {
    

    This is not specific to children or #attached, what this actually tests, is bubbling without #pre_render. Renamed as such: testRenderBubblingWithoutPreRender.

    And renamed the existing testRenderBubbling to testRenderBubblingWithPrerender.

    So actually, disregard the prior comment about the "children attached" test function; this *does* have a better place: together with the other bubbling tests.

  9. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1496 @@
    +    // Mock the cache contexts.
    +    $this->cacheContexts->expects($this->any())
    +      ->method('convertTokensToKeys')
    +      ->willReturnArgument(0);
    

    This mock isn't necessary in this test (children attached still).

    Removed.

  10. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1496 @@
    +  protected function drupalRenderPostCacheCacheElement() {
    

    Renamed this to generatePostRenderCacheElement and added docs.

  11. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1496 @@
    +    $this->setupNullCache();
    ...
    +  protected function setupNullCache() {
    +    $this->cacheFactory->expects($this->any())
    +      ->method('get')
    +      ->willReturn(new NullBackend('render'));
    +  }
    

    These are wrong. The intent here was to capture in the test assertions that nothing gets written to the cache. But it's still possible to write things to the null cache, you just can't get anything out of it.

    Renamed it to setUpUnusedCache and changed the assertion to match the intent.

  12. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1496 @@
    +  public function testPostRenderCacheWithCacheMiss() {
    

    s/WithCacheMiss/WithColdCache/

  13. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1496 @@
    +  public function testPostRenderCacheWithPostRequest() {
    ...
    +    $this->setupMemoryCache();
    ...
    +    // POST request: Ensure no data was cached.
    +    $cached_element = $this->memoryCache->get('post_render_cache_test_POST');
    +    $this->assertFalse($cached_element, 'No data is cached because this is a POST request.');
    

    Changing this to use ::setUpUnusedCache captures the same intent, but with simpler test code. It's more in line with PHPUnit tests.

Wim Leers’s picture

FileSize
103.1 KB
5.11 KB

The goal of this issue is to turn as much as possible of RenderTest into unit tests. Because unit tests allow us to truly test the Renderer, in isolation.

But since it is so very complex — it's one of the most complex pieces of code in Drupal core — I feel it makes more sense to spread the test cases across multiple files. One file with test cases that cover a certain aspect. That will make this much easier to review, and also much easier to maintain, and most importantly: much easier for other people to start to understand the renderer (and the involved complexities).

After all, RendererTest in its current incarnation is a whopping 1500 LoC. Renderer itself is only ~600!

Discussed with dawehner & Fabianx and they were generally +1, so doing that in the next reroll.

EDIT: to clarify: this is a pre-existing problem, not something introduced by this patch. But if we're doing this work to make the render system more maintainable, we might as well make the unit tests themselves maintainble too!


  1. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1523 @@
    +  public function testRenderRecursivePostRenderCache() {
    

    This is a special case of #post_render_cache, yet it is listed before all other #post_render_cache tests. Does not make sense. Moved.

  2. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1523 @@
    +    list ($test_element, $context) = $this->generatePostRenderCacheElement();
    ...
    +    list ($test_element, $context) = $this->generatePostRenderCacheElement();
    

    Here and elsewhere, we don't want the space: s/list (/list(/. Fixed.

  3. +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
    @@ -0,0 +1,1523 @@
    +  protected function setupPostRenderCallbacks() {
    +    $post_render_callback_recursive = new PostRenderCacheRecursion($this->renderer);
    +    $post_render_callback = new PostRenderCache($this->renderer);
    +    return [[$post_render_callback_recursive, 'callback'], [$post_render_callback, 'callback']];
    +  }
    

    This doesn't do anything. Removed it, and all its invocations.

Wim Leers’s picture

FileSize
105.61 KB
75.74 KB

This doesn't change a single comment, or method name, or variable name. It only spreads RendererTest across the following files:

  1. RendererTestBase (170 LoC)
  2. RendererBubblingTest (200 LoC)
  3. RendererPostRenderCacheTest (470 LoC)
  4. RendererRenderPlainTest (150 LoC)
  5. and still RendererTest (600 LoC), which now only contains the basics.

This also lets us quite clearly see where the complexities lie (or perhaps where we are lacking test coverage).


Now going back to actually reviewing again.

dawehner’s picture

Great split up!

Wim Leers’s picture

FileSize
105.3 KB
7.32 KB

RendererTest review: finished, no more complaints. Next: the 3 remaining test files.

+++ b/core/tests/Drupal/Tests/Core/Render/RendererTestBase.php
@@ -0,0 +1,172 @@
+  protected function setupGetRequest() {
  1. This is not used everywhere where it can be: sometimes this helper method is used, sometimes requests are pushed directly onto the stack. We should always use this helper method.
  2. With a tiny change, it can be used to set up any kind of request, not only GET requests.
  3. s/setup/setUp/
Wim Leers’s picture

FileSize
106.21 KB
6.53 KB

Docs fixes, minor function name improvements and most of all: restoring of the original test logic/intent of RenderTest::testDrupalRenderBubbling() to RendererBubblingTest::testBubblingWithPrerender(). Now with many more comments. Should be much more understandable than what's in HEAD.

effulgentsia’s picture

Priority: Normal » Critical
Issue tags: +blocker

Raising to critical and adding the blocker tag, based on #2429257-30: Bubble cache contexts.

Wim Leers’s picture

FileSize
135.13 KB
36.07 KB

RendererPostRenderCacheTest review: finished, no more complaints. See below for an overview of changes.

  1. Docs fixes, minor function name improvements, and some clarifications of the original test logic/intent.
  2. Deleted common_test_post_render_cache(), we now have PostRenderCache::callback() for that.
  3. Deleted common_test_post_render_cache_recursion(), we now have PostRenderCacheRecursion::callback() for that.
  4. Moved RenderTest::testDrupalRenderRenderCachePlaceholder() (from the kernel test) to \Drupal\Tests\Core\Render\RendererPostRenderCacheTest::testPlaceholder() (unit test).
  5. Moved RenderTest::testDrupalRenderChildElementRenderCachePlaceholder() (from the kernel test) to \Drupal\Tests\Core\Render\RendererPostRenderCacheTest::testChildElementPlaceholder() (unit test).
  6. Deleted common_test_post_render_cache_placeholder(), we now have PostRenderCache::placeholder() for that.
  7. Deleted core/modules/system/tests/modules/common_test/templates/common-test-render-element.html.twig — that is now mocked behavior.

i.e. moved the last two test cases from Kernel tests to Unit tests for which that conversion is possible.

Wim Leers’s picture

FileSize
135.07 KB
4.23 KB

RendererRecursionTest review: finished, no more complaints.

While cleaning up RendererRenderPlainTest, I noticed the name is not a perfect match. RendererRecursionTest is better.
Fixed docs.

Wim Leers’s picture

Assigned: Wim Leers » Unassigned
Status: Needs review » Reviewed & tested by the community

While definitely not perfect unit test coverage, I feel like @dawehner's awesome work is in no way a regression, and only an improvement. The rerolls I've been posting since #25 are solely part of the review process:

  1. the original RenderTest had grown organically over the years and was extremely unwieldy
  2. hence dawehner made the best out of it while converting each test method, one by one
  3. in doing so, some bits of the original test intent were lost — but only a few. I only know because I'm partially responsible for that organic growth. I've added docs and made minor changes to bring back the original intent where necessary.
  4. finally, in making sure that not a single test was lost, the different method orders (which doesn't actually matter for the tests themselves of course) and introduction of new helper methods (yay!), and after having talked to dawehner and Fabianx, we decided to split it up into several unit tests, each covering a different aspect of the renderer. This makes it both easier to review for the scope of this issue, but also makes it easier to maintain the renderer and its test suite going forward, and last but not least: it should help to make it easier to understand the renderer!

Since I feel the reroll work was a necessary part of the review process — or at least necessary to speed it up — and since I'm one of the very few people who actually know the RenderTest tests, I still feel comfortable RTBC'ing this patch.

dawehner’s picture

Issue tags: -Novice, -php-novice, -Security
FileSize
133.24 KB
8.29 KB

Did a couple of more minor points, but I really think this does not block the RTBC status from it.

Let's clean up the tests a bit :) Both of them aren't true anylonger.

Status: Reviewed & tested by the community » Needs work

The last submitted patch, 35: 2378883-35.patch, failed testing.

dawehner’s picture

Status: Needs work » Reviewed & tested by the community
FileSize
133.24 KB
660 bytes

This was not intended.

Wim Leers’s picture

All of #35 is minor clean-up, no fundamental changes.

RTBC +1

Wim Leers’s picture

Issue summary: View changes

Added beta evaluation.

webchick’s picture

Status: Reviewed & tested by the community » Fixed

Hm. I'm not really clear on why this must be done in order to address the parent issue, it seems like more of a clean-up (the issue summary doesn't help). It's a good clean-up to make nevertheless, and it's not changing the public API, and makes things less fragile, so is fine to do during beta.

Committed and pushed to 8.0.x. Thanks!

  • webchick committed 1614664 on 8.0.x
    Issue #2378883 by Wim Leers, dawehner: Convert existing drupal_render()...

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.