private Iterable<TestResult> pruneToDepth(List<TestResult> results, Integer depth) {
    // Prune the response to the requested depth
    // 0 - TestResult
    // 1 - TestCapability
    // 2 - TestSuite
    // 3 - TestCase
    // 4 - Entire response
    // null - Entire response
    if (depth == null || depth > 3) {
      return results;
    }
    for (TestResult result : results) {
      if (depth == 0) {
        result.getTestCapabilities().clear();
      } else {
        for (TestCapability testCapability : result.getTestCapabilities()) {
          if (depth == 1) {
            testCapability.getTestSuites().clear();
          } else {
            for (TestSuite testSuite : testCapability.getTestSuites()) {
              if (depth == 2) {
                testSuite.getTestCases().clear();
              } else { // depth == 3
                for (TestCase testCase : testSuite.getTestCases()) {
                  testCase.getTestSteps().clear();
                }
              }
            }
          }
        }
      }
    }

    return results;
  }
  @Override
  public String create(TestDataCreateRequest request) throws HygieiaException {
    /**
     * Step 1: create Collector if not there Step 2: create Collector item if not there Step 3:
     * Insert test data if new. If existing, update it
     */
    Collector collector = createCollector();

    if (collector == null) {
      throw new HygieiaException(
          "Failed creating Test collector.", HygieiaException.COLLECTOR_CREATE_ERROR);
    }

    CollectorItem collectorItem = createCollectorItem(collector, request);

    if (collectorItem == null) {
      throw new HygieiaException(
          "Failed creating Test collector item.", HygieiaException.COLLECTOR_ITEM_CREATE_ERROR);
    }

    TestResult testResult = createTest(collectorItem, request);

    if (testResult == null) {
      throw new HygieiaException(
          "Failed inserting/updating Test information.", HygieiaException.ERROR_INSERTING_DATA);
    }

    return testResult.getId().toString();
  }
  private TestResult createTest(CollectorItem collectorItem, TestDataCreateRequest request) {
    TestResult testResult =
        testResultRepository.findByCollectorItemIdAndExecutionId(
            collectorItem.getId(), request.getExecutionId());
    if (testResult == null) {
      testResult = new TestResult();
    }

    testResult.setTargetAppName(request.getTargetAppName());
    testResult.setTargetEnvName(request.getTargetEnvName());
    testResult.setCollectorItemId(collectorItem.getId());
    testResult.setType(request.getType());
    testResult.setDescription(request.getDescription());
    testResult.setDuration(request.getDuration());
    testResult.setEndTime(request.getEndTime());
    testResult.setExecutionId(request.getExecutionId());
    testResult.setFailureCount(request.getFailureCount());
    testResult.setSkippedCount(request.getSkippedCount());
    testResult.setStartTime(request.getStartTime());
    testResult.setSuccessCount(request.getSuccessCount());
    testResult.setTimestamp(request.getTimestamp());
    testResult.setTotalCount(request.getTotalCount());
    testResult.setUnknownStatusCount(request.getUnknownStatusCount());
    testResult.setUrl(request.getTestJobUrl());
    testResult.getTestCapabilities().addAll(request.getTestCapabilities());
    testResult.setBuildId(new ObjectId(request.getTestJobId()));

    return testResultRepository.save(testResult);
  }
  @Test
  public void test_endToend() throws Exception {

    String artifacts = getJson("job-artifacts.json");
    String cucumberJson = getJson("two-features.json");

    URI lastBuildArtifactUri =
        URI.create(
            "http://server/job/job1/lastSuccessfulBuild/api/json?tree=timestamp,duration,number,fullDisplayName,building,artifacts[fileName,relativePath]");
    URI cucumberJsonUri =
        URI.create(
            "http://server/job/job1/lastSuccessfulBuild/artifact/job1/test1/report/web/cucumber.json");
    when(rest.exchange(
            eq(lastBuildArtifactUri),
            eq(HttpMethod.GET),
            Matchers.any(HttpEntity.class),
            eq(String.class)))
        .thenReturn(new ResponseEntity<String>(artifacts, HttpStatus.OK));
    when(rest.exchange(
            eq(cucumberJsonUri),
            eq(HttpMethod.GET),
            Matchers.any(HttpEntity.class),
            eq(String.class)))
        .thenReturn(new ResponseEntity<String>(cucumberJson, HttpStatus.OK));
    TestResult testResult = defaultJenkinsClient.getCucumberTestResult("http://server/job/job1/");
    Collection<TestCapability> capabilities = testResult.getTestCapabilities();
    assertThat(capabilities, notNullValue());

    Iterator<TestCapability> capabilityIterator = capabilities.iterator();

    TestCapability capability = capabilityIterator.next();
    List<TestSuite> suites = (List<TestSuite>) capability.getTestSuites();
    assertThat(suites, notNullValue());

    Iterator<TestSuite> suiteIt = suites.iterator();
    Iterator<TestCase> testCaseIt;
    TestSuite suite;

    suite = suiteIt.next();
    testCaseIt = suite.getTestCases().iterator();
    assertSuite(suite, "Feature:eCUKE Feature", 4, 0, 0, 4, 15019839l);

    assertTestCase(
        testCaseIt.next(),
        "ecuke-feature;i-say-hi",
        "Scenario:I say hi",
        4001555l,
        TestCaseStatus.Success);
    assertThat(testCaseIt.hasNext(), is(true));

    assertTestCase(
        testCaseIt.next(),
        "ecuke-feature;you-say-hi",
        "Scenario:You say hi",
        1001212l,
        TestCaseStatus.Success);
    assertThat(testCaseIt.hasNext(), is(true));

    assertTestCase(
        testCaseIt.next(),
        "ecuke-feature;eating-cucumbers",
        "Scenario Outline:Eating Cucumbers",
        2013197l,
        TestCaseStatus.Success);
    assertThat(testCaseIt.hasNext(), is(true));

    assertTestCase(
        testCaseIt.next(),
        "ecuke-feature;eating-cucumbers",
        "Scenario Outline:Eating Cucumbers",
        8003875l,
        TestCaseStatus.Success);
    assertThat(testCaseIt.hasNext(), is(false));
  }