diff --git a/golden/modules/triagelog-page-sk/triagelog-page-sk_test.js b/golden/modules/triagelog-page-sk/triagelog-page-sk_test.js
index f80bd36..bc099d9 100644
--- a/golden/modules/triagelog-page-sk/triagelog-page-sk_test.js
+++ b/golden/modules/triagelog-page-sk/triagelog-page-sk_test.js
@@ -17,27 +17,24 @@
   // Component under test.
   let triagelogPageSk;
 
-  // Each test case is responsible for instantiating its component under test.
+  // Creates a new instance of the component under test.
   function newTriagelogPageSk() {
     triagelogPageSk = document.createElement('triagelog-page-sk');
     document.body.appendChild(triagelogPageSk);
   }
 
-  // Convenience functions to query child DOM nodes of the component under test.
-  const q = (str) => $(str, triagelogPageSk);
-  const qq = (str) => $$(str, triagelogPageSk);
+  // Same as newTriagelogPageSk, but returns a promise that will resolve when
+  // the page finishes loading.
+  function loadTriagelogPageSk() {
+    const event = eventPromise('end-task');
+    newTriagelogPageSk();
+    return event;
+  }
 
   beforeEach(async () => {
-    // The test runner will pollute the URL with its own query string, so we
-    // need to clean it before running our test cases, as this could interfere
-    // with the stateReflector.
-    history.pushState(
-        null,
-        '',
-        window.location.origin + window.location.pathname + '?');
-
-    // Make sure the component under test is defined before carrying on.
-    await window.customElements.whenDefined('triagelog-page-sk');
+    // Clear query string before each test case. This is needed for test cases
+    // that exercise the stateReflector and the browser's back/forward buttons.
+    setQueryString('');
   });
 
   afterEach(() => {
@@ -46,7 +43,8 @@
       document.body.removeChild(triagelogPageSk);
       triagelogPageSk = null;
     }
-
+    expect(fetchMock.done()).to.be.true;
+    expectNoUnmatchedCalls(fetchMock);
     // Remove fetch mocking to prevent test cases interfering with each other.
     fetchMock.reset();
   });
@@ -54,311 +52,108 @@
   describe('details hidden', () => {
     it('shows the right initial entries', async () => {
       fetchMock.get(
-          '/json/triagelog?details=false&offset=0&size=20',
-          firstPage);
+          '/json/triagelog?details=false&offset=0&size=20', firstPage);
 
-      // Instantiate the page. This retrieves the first page of triage logs.
-      await endTaskEvent(newTriagelogPageSk);
-
-      // Assert that the query string was updated with the pagination parameters
-      // returned by the mock RPC.
-      expect(window.location.search).to.equal("?page_size=3");
-
-      // Assert that we get the first page of triagelog entries.
-      expect(nthEntry(0)).to.deep.equal(
-          [toLocalDateStr(1572000000000), 'alpha@google.com', 2]);
-      expect(nthEntry(1)).to.deep.equal(
-          [toLocalDateStr(1571900000000), 'beta@google.com', 1]);
-      expect(nthEntry(2)).to.deep.equal(
-          [toLocalDateStr(1571800000000), 'gamma@google.com', 1]);
-
-      // Assert that no details are visible.
-      expect(q('.details .test-name')).to.be.empty;
-
-      expect(fetchMock.done()).to.be.true;
-      expectNoUnmatchedCalls(fetchMock);
+      await loadTriagelogPageSk(); // Load first page of results by default.
+      expectQueryStringToEqual('?page_size=3'); // Page size picked up from RPC.
+      expectFirstPageOfResultsDetailsHidden();
     });
 
-    it('loads the next page', async () => {
+    it('advances to the second page of results', async () => {
       fetchMock.get(
-          '/json/triagelog?details=false&offset=0&size=20',
-          firstPage);
+          '/json/triagelog?details=false&offset=0&size=20', firstPage);
       fetchMock.get(
-          '/json/triagelog?details=false&offset=3&size=3',
-          secondPage);
+          '/json/triagelog?details=false&offset=3&size=3', secondPage);
 
-      // Instantiate the page. This retrieves the first page of triage logs.
-      await endTaskEvent(newTriagelogPageSk);
-
-      // Advance to the next page.
-      await endTaskEvent(() => qq('pagination-sk button.next').click());
-
-      // Assert that the query string was updated with the pagination parameters
-      // returned by the mock RPC.
-      expect(window.location.search).to.equal("?offset=3&page_size=3");
-
-      // Assert that we get the second page of triagelog entries.
-      expect(nthEntry(0)).to.deep.equal(
-          [toLocalDateStr(1571700000000), 'delta@google.com', 1]);
-      expect(nthEntry(1)).to.deep.equal(
-          [toLocalDateStr(1571600000000), 'epsilon@google.com', 1]);
-      expect(nthEntry(2)).to.deep.equal(
-          [toLocalDateStr(1571500000000), 'zeta@google.com', 1]);
-
-      // Assert that no details are visible.
-      expect(q('.details .test-name')).to.be.empty;
-
-      expect(fetchMock.done()).to.be.true;
-      expectNoUnmatchedCalls(fetchMock);
+      await loadTriagelogPageSk();   // Load first page of results by default.
+      await goToNextPageOfResults(); // Load second page.
+      expectQueryStringToEqual('?offset=3&page_size=3'); // Reflected in URL.
+      expectSecondPageOfResultsDetailsHidden();
     });
 
     it('undoes an entry', async () => {
       fetchMock.get(
-          '/json/triagelog?details=false&offset=0&size=20',
-          firstPage);
+          '/json/triagelog?details=false&offset=0&size=20', firstPage);
       fetchMock.post(
-          '/json/triagelog/undo?id=aaa',
-          firstPageAfterUndoingFirstEntry);
+          '/json/triagelog/undo?id=aaa', firstPageAfterUndoingFirstEntry);
 
-      // Instantiate the page. This retrieves the first page of triage logs.
-      await endTaskEvent(newTriagelogPageSk);
-
-      // Undo first entry.
-      await endTaskEvent(() => qq('tbody button.undo').click());
-
-      // Assert that the query string was updated with the pagination parameters
-      // returned by the mock RPC.
-      expect(window.location.search).to.equal("?page_size=3");
-
-      // Assert that we get the first page of triagelog entries minus the undone
-      // one.
-      expect(nthEntry(0)).to.deep.equal(
-          [toLocalDateStr(1571900000000), 'beta@google.com', 1]);
-      expect(nthEntry(1)).to.deep.equal(
-          [toLocalDateStr(1571800000000), 'gamma@google.com', 1]);
-      expect(nthEntry(2)).to.deep.equal(
-          [toLocalDateStr(1571700000000), 'delta@google.com', 1]);
-
-      // Assert that no details are visible.
-      expect(q('.details .test-name')).to.be.empty;
-
-      expect(fetchMock.done()).to.be.true;
-      expectNoUnmatchedCalls(fetchMock);
+      await loadTriagelogPageSk(); // Load first page of results by default.
+      await undoFirstEntry();
+      expectFirstPageOfResultsFirstEntryUndoneDetailsHidden();
     });
   });
 
   describe('details visible', () => {
-    it('shows details when checkbox is clicked', async () => {
+    it('shows/hides details when checkbox is clicked', async () => {
       fetchMock.get(
-          '/json/triagelog?details=false&offset=0&size=20',
-          firstPage);
+          // Initial request with default page size.
+          '/json/triagelog?details=false&offset=0&size=20', firstPage);
       fetchMock.get(
-          '/json/triagelog?details=true&offset=0&size=3',
-          firstPageWithDetails);
+          // Subsequent request with page size read from earlier RPC.
+          '/json/triagelog?details=false&offset=0&size=3', firstPage);
+      fetchMock.get(
+          '/json/triagelog?details=true&offset=0&size=3', firstPageWithDetails);
 
-      // Instantiate the page. This retrieves the first page of triage logs.
-      await endTaskEvent(newTriagelogPageSk);
+      await loadTriagelogPageSk(); // Load first page of results by default.
+      await toggleDetails(); // Show details.
+      expectQueryStringToEqual('?details=true&page_size=3');
+      expectFirstPageOfResultsDetailsVisible();
 
-      // Show details.
-      await endTaskEvent(() => qq('.details-checkbox').click());
-
-      // Assert that the query string was updated with the pagination parameters
-      // returned by the mock RPC.
-      expect(window.location.search).to.equal("?details=true&page_size=3");
-
-      // Assert that we get the first page of triagelog entries with details.
-      expect(nthEntry(0)).to.deep.equal(
-          [toLocalDateStr(1572000000000), 'alpha@google.com', 2]);
-      expect(nthDetailsRow(0)).to.deep.equal([
-          'async_rescale_and_read_dog_up',
-          'f16298eb14e19f9230fe81615200561f',
-          digestDetailsHref(
-              'async_rescale_and_read_dog_up',
-              'f16298eb14e19f9230fe81615200561f'),
-          'positive']);
-      expect(nthDetailsRow(1)).to.deep.equal([
-          'async_rescale_and_read_rose',
-          '35c77280a7d5378033f9bf8f3c755e78',
-          digestDetailsHref(
-              'async_rescale_and_read_rose',
-              '35c77280a7d5378033f9bf8f3c755e78'),
-          'positive']);
-      expect(nthEntry(1)).to.deep.equal(
-          [toLocalDateStr(1571900000000), 'beta@google.com', 1]);
-      expect(nthDetailsRow(2)).to.deep.equal([
-          'draw_image_set',
-          'b788aadee662c2b0390d698cbe68b808',
-          digestDetailsHref(
-              'draw_image_set',
-              'b788aadee662c2b0390d698cbe68b808'),
-          'positive']);
-      expect(nthEntry(2)).to.deep.equal(
-          [toLocalDateStr(1571800000000), 'gamma@google.com', 1]);
-      expect(nthDetailsRow(3)).to.deep.equal([
-          'filterbitmap_text_7.00pt',
-          '454b4b547bc6ceb4cdeb3305553be98a',
-          digestDetailsHref(
-              'filterbitmap_text_7.00pt',
-              '454b4b547bc6ceb4cdeb3305553be98a'),
-          'positive']);
-
-      expect(fetchMock.done()).to.be.true;
-      expectNoUnmatchedCalls(fetchMock);
+      await toggleDetails(); // Hide details.
+      expectQueryStringToEqual('?page_size=3');
+      expectFirstPageOfResultsDetailsHidden();
     });
 
-    it('details remain visible when loading next page', async () => {
+    it('details remain visible after advancing to the next page', async () => {
       fetchMock.get(
-          '/json/triagelog?details=false&offset=0&size=20',
-          firstPage);
+          '/json/triagelog?details=false&offset=0&size=20', firstPage);
       fetchMock.get(
-          '/json/triagelog?details=true&offset=0&size=3',
-          firstPageWithDetails);
+          '/json/triagelog?details=true&offset=0&size=3', firstPageWithDetails);
       fetchMock.get(
           '/json/triagelog?details=true&offset=3&size=3',
           secondPageWithDetails);
 
-      // Instantiate the page. This retrieves the first page of triage logs.
-      await endTaskEvent(newTriagelogPageSk);
-
-      // Show details.
-      await endTaskEvent(() => qq('.details-checkbox').click());
-
-      // Advance to the next page.
-      await endTaskEvent(() => qq('pagination-sk button.next').click());
-
-      // Assert that the query string was updated with the pagination parameters
-      // returned by the mock RPC.
-      expect(window.location.search).to.equal(
-          "?details=true&offset=3&page_size=3");
-
-      // Assert that we get the second page of triagelog entries with details.
-      expect(nthEntry(0)).to.deep.equal(
-          [toLocalDateStr(1571700000000), 'delta@google.com', 1]);
-      expect(nthDetailsRow(0)).to.deep.equal([
-          'filterbitmap_text_10.00pt',
-          'fc8392000945e68334c5ccd333b201b3',
-          digestDetailsHref(
-              'filterbitmap_text_10.00pt',
-              'fc8392000945e68334c5ccd333b201b3'),
-          'positive']);
-      expect(nthEntry(1)).to.deep.equal([
-          toLocalDateStr(1571600000000),
-          'epsilon@google.com',
-          1]);
-      expect(nthDetailsRow(1)).to.deep.equal([
-          'filterbitmap_image_mandrill_32.png',
-          '7606bfd486f7dfdf299d9d9da8f99c8e',
-          digestDetailsHref(
-              'filterbitmap_image_mandrill_32.png',
-              '7606bfd486f7dfdf299d9d9da8f99c8e'),
-          'positive']);
-      expect(nthEntry(2)).to.deep.equal(
-          [toLocalDateStr(1571500000000), 'zeta@google.com', 1]);
-      expect(nthDetailsRow(2)).to.deep.equal([
-          'drawminibitmaprect_aa',
-          '95e1b42fcaaff5d0d08b4ed465d79437',
-          digestDetailsHref(
-              'drawminibitmaprect_aa',
-              '95e1b42fcaaff5d0d08b4ed465d79437'),
-          'positive']);
-
-      expect(fetchMock.done()).to.be.true;
-      expectNoUnmatchedCalls(fetchMock);
+      await loadTriagelogPageSk(); // Load first page of results by default.
+      await toggleDetails(); // Show details.
+      await goToNextPageOfResults();
+      expectQueryStringToEqual('?details=true&offset=3&page_size=3');
+      expectSecondPageOfResultsDetailsVisible();
     });
 
     it('undoes an entry, which unchecks "Show details"', async () => {
+      // The undo RPC endpoint returns the first results page without details,
+      // so we need to uncheck the "Show details" checkbox before re-rendering.
+      // See method _undoEntry() in triagelog-page-sk.js for more.
+
       fetchMock.get(
-          '/json/triagelog?details=false&offset=0&size=20',
-          firstPage);
+          '/json/triagelog?details=false&offset=0&size=20', firstPage);
       fetchMock.get(
-          '/json/triagelog?details=true&offset=0&size=3',
-          firstPageWithDetails);
+          '/json/triagelog?details=true&offset=0&size=3', firstPageWithDetails);
       fetchMock.post(
-          '/json/triagelog/undo?id=aaa',
-          firstPageAfterUndoingFirstEntry);
+          '/json/triagelog/undo?id=aaa', firstPageAfterUndoingFirstEntry);
 
-      // Instantiate the page. This retrieves the first page of triage logs.
-      await endTaskEvent(newTriagelogPageSk);
+      await loadTriagelogPageSk(); // Load first page of results by default.
+      await toggleDetails(); // Show details.
+      expectQueryStringToEqual('?details=true&page_size=3');
+      expectShowDetailsCheckboxToBeChecked();
+      expectFirstPageOfResultsDetailsVisible();
 
-      // Show details.
-      await endTaskEvent(() => qq('.details-checkbox').click());
-
-      // Undo first entry.
-      await endTaskEvent(() => qq('tbody button.undo').click());
-
-      // Assert that the query string was updated with the pagination parameters
-      // returned by the mock RPC.
-      expect(window.location.search).to.equal("?page_size=3");
-
-      // "Show details" should be unchecked now.
-      expect(qq('.details-checkbox').checked).to.be.false;
-
-      // Assert that we get the first page of triagelog entries.
-      expect(nthEntry(0)).to.deep.equal(
-          [toLocalDateStr(1571900000000), 'beta@google.com', 1]);
-      expect(nthEntry(1)).to.deep.equal(
-          [toLocalDateStr(1571800000000), 'gamma@google.com', 1]);
-      expect(nthEntry(2)).to.deep.equal(
-          [toLocalDateStr(1571700000000), 'delta@google.com', 1]);
-
-      // Assert that no details are visible.
-      expect(q('.details .test-name')).to.be.empty;
-
-      expect(fetchMock.done()).to.be.true;
-      expectNoUnmatchedCalls(fetchMock);
+      await undoFirstEntry();
+      expectQueryStringToEqual('?page_size=3');
+      expectShowDetailsCheckboxNotToBeChecked();
+      expectFirstPageOfResultsFirstEntryUndoneDetailsHidden();
     });
   });
 
   describe('URL parameters', () => {
     it('initializes paging based on the URL parameters', async () => {
-      // Query string set to second page of results, with details.
-      const queryString = '?details=true&offset=3&page_size=3';
-      history.pushState(
-          null,
-          '',
-          window.location.origin + window.location.pathname + queryString);
-
       fetchMock.get(
-          '/json/triagelog?details=true&offset=3&size=3',
-          secondPageWithDetails);
+          '/json/triagelog?details=true&offset=3&size=3', secondPageWithDetails);
 
-      // Instantiate the page. This retrieves the first page of triage logs.
-      await endTaskEvent(newTriagelogPageSk);
-
-      // "Show details" should be checked.
-      expect(qq('.details-checkbox').checked).to.be.true;
-
-      // Assert that we get the second page of triagelog entries with details.
-      expect(nthEntry(0)).to.deep.equal(
-          [toLocalDateStr(1571700000000), 'delta@google.com', 1]);
-      expect(nthDetailsRow(0)).to.deep.equal([
-          'filterbitmap_text_10.00pt',
-          'fc8392000945e68334c5ccd333b201b3',
-          digestDetailsHref(
-              'filterbitmap_text_10.00pt',
-              'fc8392000945e68334c5ccd333b201b3'),
-          'positive']);
-      expect(nthEntry(1)).to.deep.equal(
-          [toLocalDateStr(1571600000000), 'epsilon@google.com', 1]);
-      expect(nthDetailsRow(1)).to.deep.equal([
-          'filterbitmap_image_mandrill_32.png',
-          '7606bfd486f7dfdf299d9d9da8f99c8e',
-          digestDetailsHref(
-              'filterbitmap_image_mandrill_32.png',
-              '7606bfd486f7dfdf299d9d9da8f99c8e'),
-          'positive']);
-      expect(nthEntry(2)).to.deep.equal(
-          [toLocalDateStr(1571500000000), 'zeta@google.com', 1]);
-      expect(nthDetailsRow(2)).to.deep.equal([
-          'drawminibitmaprect_aa',
-          '95e1b42fcaaff5d0d08b4ed465d79437',
-          digestDetailsHref(
-              'drawminibitmaprect_aa',
-              '95e1b42fcaaff5d0d08b4ed465d79437'),
-          'positive']);
-
-      expect(fetchMock.done()).to.be.true;
-      expectNoUnmatchedCalls(fetchMock);
+      setQueryString('?details=true&offset=3&page_size=3');
+      await loadTriagelogPageSk();
+      expectShowDetailsCheckboxToBeChecked();
+      expectSecondPageOfResultsDetailsVisible();
     });
   });
 
@@ -366,16 +161,162 @@
     it('should emit event "fetch-error" on RPC failure', async () => {
       fetchMock.get('glob:*', 500);  // Internal server error on any request.
 
-      // Instantiate the page. This will try retrieving the first page of
-      // results and fail with an internal server error.
-      await fetchErrorEvent(newTriagelogPageSk);
+      const event = eventPromise('fetch-error');
+      newTriagelogPageSk();
+      await event;
 
-      // At this point it's guaranteed that the fetch-error event was caught.
-      // Assert that there are no log entries on screen.
-      expect($$('tbody').children).to.be.empty;
+      expectEmptyPage();
     });
   });
 
+  function setQueryString(string) {
+    history.pushState(
+        null,
+        '',
+        window.location.origin + window.location.pathname + string);
+  }
+
+  function goToNextPageOfResults() {
+    const event = eventPromise('end-task');
+    qq('pagination-sk button.next').click();
+    return event;
+  }
+
+  function toggleDetails() {
+    const event = eventPromise('end-task');
+    qq('.details-checkbox').click();
+    return event;
+  }
+
+  function undoFirstEntry() {
+    const event = eventPromise('end-task');
+    qq('tbody button.undo').click();
+    return event;
+  }
+
+  function expectQueryStringToEqual(expected) {
+    expect(window.location.search).to.equal(expected);
+  }
+
+  function expectShowDetailsCheckboxToBeChecked() {
+    expect(qq('.details-checkbox').checked).to.be.true;
+  }
+
+  function expectShowDetailsCheckboxNotToBeChecked() {
+    expect(qq('.details-checkbox').checked).to.be.false;
+  }
+
+  function expectEmptyPage() {
+    expect($$('tbody').children).to.be.empty;
+  }
+
+  function expectFirstPageOfResultsDetailsHidden() {
+    expect(nthEntry(0)).to.deep.equal(
+        [toLocalDateStr(1572000000000), 'alpha@google.com', 2]);
+    expect(nthEntry(1)).to.deep.equal(
+        [toLocalDateStr(1571900000000), 'beta@google.com', 1]);
+    expect(nthEntry(2)).to.deep.equal(
+        [toLocalDateStr(1571800000000), 'gamma@google.com', 1]);
+    expectNoDetails();
+  }
+
+  function expectFirstPageOfResultsFirstEntryUndoneDetailsHidden() {
+    expect(nthEntry(0)).to.deep.equal(
+        [toLocalDateStr(1571900000000), 'beta@google.com', 1]);
+    expect(nthEntry(1)).to.deep.equal(
+        [toLocalDateStr(1571800000000), 'gamma@google.com', 1]);
+    expect(nthEntry(2)).to.deep.equal(
+        [toLocalDateStr(1571700000000), 'delta@google.com', 1]);
+    expectNoDetails();
+  }
+
+  function expectFirstPageOfResultsDetailsVisible() {
+    expect(nthEntry(0)).to.deep.equal(
+        [toLocalDateStr(1572000000000), 'alpha@google.com', 2]);
+    expect(nthDetailsRow(0)).to.deep.equal([
+      'async_rescale_and_read_dog_up',
+      'f16298eb14e19f9230fe81615200561f',
+      digestDetailsHref(
+          'async_rescale_and_read_dog_up',
+          'f16298eb14e19f9230fe81615200561f'),
+      'positive']);
+    expect(nthDetailsRow(1)).to.deep.equal([
+      'async_rescale_and_read_rose',
+      '35c77280a7d5378033f9bf8f3c755e78',
+      digestDetailsHref(
+          'async_rescale_and_read_rose',
+          '35c77280a7d5378033f9bf8f3c755e78'),
+      'positive']);
+    expect(nthEntry(1)).to.deep.equal(
+        [toLocalDateStr(1571900000000), 'beta@google.com', 1]);
+    expect(nthDetailsRow(2)).to.deep.equal([
+      'draw_image_set',
+      'b788aadee662c2b0390d698cbe68b808',
+      digestDetailsHref(
+          'draw_image_set',
+          'b788aadee662c2b0390d698cbe68b808'),
+      'positive']);
+    expect(nthEntry(2)).to.deep.equal(
+        [toLocalDateStr(1571800000000), 'gamma@google.com', 1]);
+    expect(nthDetailsRow(3)).to.deep.equal([
+      'filterbitmap_text_7.00pt',
+      '454b4b547bc6ceb4cdeb3305553be98a',
+      digestDetailsHref(
+          'filterbitmap_text_7.00pt',
+          '454b4b547bc6ceb4cdeb3305553be98a'),
+      'positive']);
+  }
+
+  function expectSecondPageOfResultsDetailsHidden() {
+    expect(nthEntry(0)).to.deep.equal(
+        [toLocalDateStr(1571700000000), 'delta@google.com', 1]);
+    expect(nthEntry(1)).to.deep.equal(
+        [toLocalDateStr(1571600000000), 'epsilon@google.com', 1]);
+    expect(nthEntry(2)).to.deep.equal(
+        [toLocalDateStr(1571500000000), 'zeta@google.com', 1]);
+    expectNoDetails();
+  }
+
+  function expectSecondPageOfResultsDetailsVisible() {
+    expect(nthEntry(0)).to.deep.equal(
+        [toLocalDateStr(1571700000000), 'delta@google.com', 1]);
+    expect(nthDetailsRow(0)).to.deep.equal([
+      'filterbitmap_text_10.00pt',
+      'fc8392000945e68334c5ccd333b201b3',
+      digestDetailsHref(
+          'filterbitmap_text_10.00pt',
+          'fc8392000945e68334c5ccd333b201b3'),
+      'positive']);
+    expect(nthEntry(1)).to.deep.equal([
+      toLocalDateStr(1571600000000),
+      'epsilon@google.com',
+      1]);
+    expect(nthDetailsRow(1)).to.deep.equal([
+      'filterbitmap_image_mandrill_32.png',
+      '7606bfd486f7dfdf299d9d9da8f99c8e',
+      digestDetailsHref(
+          'filterbitmap_image_mandrill_32.png',
+          '7606bfd486f7dfdf299d9d9da8f99c8e'),
+      'positive']);
+    expect(nthEntry(2)).to.deep.equal(
+        [toLocalDateStr(1571500000000), 'zeta@google.com', 1]);
+    expect(nthDetailsRow(2)).to.deep.equal([
+      'drawminibitmaprect_aa',
+      '95e1b42fcaaff5d0d08b4ed465d79437',
+      digestDetailsHref(
+          'drawminibitmaprect_aa',
+          '95e1b42fcaaff5d0d08b4ed465d79437'),
+      'positive']);
+  }
+
+  function expectNoDetails() {
+    expect(q('.details .test-name')).to.be.empty;
+  }
+
+  // Convenience functions to query child DOM nodes of the component under test.
+  const q = (str) => $(str, triagelogPageSk);
+  const qq = (str) => $$(str, triagelogPageSk);
+
   const toLocalDateStr = (timestampMS) => new Date(timestampMS).toLocaleString();
   const digestDetailsHref = (test, digest) =>
       window.location.origin +
@@ -402,33 +343,13 @@
       nthDetailsRowLabel(n)
   ];
 
-  // TODO(lovisolo): Add function to build a promise that will resolve when the
-  //                 given sequence of events is caught.
+  // TODO(lovisolo): Add a function eventSequencePromise() to test_util.js that
+  //                 takes a list of event names and returns a promise that
+  //                 resolves when the events are caught in the given sequence,
+  //                 or reject if any of the events are caught out-of-sequence.
+  //                 Leverage eventPromise() to implement this.
   //
-  // TODO(lovisolo): Use said function to assert on the tests above that event
-  //                 "begin-task" always precedes events "end-task" and
-  //                 "fetch-error".
-  //
-  // TODO(lovisolo): Move said promise builder functions to test_util.js.
-
-  // Adds an event handler for "end-task", then calls the given function.
-  // Returns a promise that will resolve when the event is caught.
-  //
-  // The promise will be rejected if the event isn't caught within 5 seconds.
-  function endTaskEvent(fn) {
-    const promise = eventPromise('end-task');
-    fn();
-    return promise;
-  }
-
-  // Adds an event handler for "fetch-error", then calls the given function.
-  // Returns a promise that will resolve when the event is caught.
-  //
-  // The promise will be rejected if the event isn't caught within 5 seconds.
-  function fetchErrorEvent(fn) {
-    const promise = eventPromise('fetch-error');
-    fn();
-    return promise;
-  }
+  // TODO(lovisolo): Use eventSequencePromise(['begin-task', 'end-task']) above
+  //                 where appropriate. Idem with 'fetch-error'.
 
 });
