Re-enable test_nonvoting_pipeline

Here we enabled our nonvoting pipeline test again. It seems we also
needed to create a check pipeline noop job, otherwise our pipeline
queues (for check) would not be empty.

Change-Id: I1269e8de632f847dbacbde187d609bbab1ac8179
Signed-off-by: Paul Belanger <pabelanger@redhat.com>
diff --git a/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml b/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml
index 01de2aa..de477dd 100644
--- a/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml
@@ -36,6 +36,19 @@
         verified: 0
     precedence: high
 
+- pipeline:
+    name: experimental
+    manager: independent
+    source:
+      gerrit
+    trigger:
+      gerrit:
+        - event: patchset-created
+    success:
+      gerrit: {}
+    failure:
+      gerrit: {}
+
 - job:
     name: project-merge
     hold-following-changes: true
@@ -56,6 +69,9 @@
 - job:
     name: project-test2
 
+- job:
+    name: experimental-project-test
+
 - project:
     name: org/project
     gate:
@@ -84,3 +100,11 @@
             jobs:
               - project-test1
               - project-test2
+
+- project:
+    name: org/experimental-project
+    experimental:
+      jobs:
+        - project-merge:
+            jobs:
+              - experimental-project-test
diff --git a/tests/fixtures/config/single-tenant/git/org_experimental-project/README b/tests/fixtures/config/single-tenant/git/org_experimental-project/README
new file mode 100644
index 0000000..9daeafb
--- /dev/null
+++ b/tests/fixtures/config/single-tenant/git/org_experimental-project/README
@@ -0,0 +1 @@
+test
diff --git a/tests/test_scheduler.py b/tests/test_scheduler.py
index e812e32..2a74eeb 100755
--- a/tests/test_scheduler.py
+++ b/tests/test_scheduler.py
@@ -3884,7 +3884,6 @@
         running_items = client.get_running_jobs()
         self.assertEqual(0, len(running_items))
 
-    @skip("Disabled for early v3 development")
     def test_nonvoting_pipeline(self):
         "Test that a nonvoting pipeline (experimental) can still report"
 
@@ -3892,6 +3891,9 @@
                                            'master', 'A')
         self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
         self.waitUntilSettled()
+
+        self.assertEqual(self.getJobFromHistory('project-merge').result,
+                         'SUCCESS')
         self.assertEqual(
             self.getJobFromHistory('experimental-project-test').result,
             'SUCCESS')
diff --git a/zuul/manager/independent.py b/zuul/manager/independent.py
index d3b6b0d..3d28327 100644
--- a/zuul/manager/independent.py
+++ b/zuul/manager/independent.py
@@ -29,8 +29,6 @@
         # creates a new change queue for every change
         if existing:
             return DynamicChangeQueueContextManager(existing)
-        if change.project not in self.pipeline.getProjects():
-            self.pipeline.addProject(change.project)
         change_queue = model.ChangeQueue(self.pipeline)
         change_queue.addProject(change.project)
         self.pipeline.addQueue(change_queue)
diff --git a/zuul/model.py b/zuul/model.py
index 0aa1ad5..53c4646 100644
--- a/zuul/model.py
+++ b/zuul/model.py
@@ -1770,9 +1770,13 @@
 
     def createJobTree(self, item):
         project_config = self.project_configs[item.change.project.name]
-        project_tree = project_config.pipelines[item.pipeline.name].job_tree
         ret = JobTree(None)
-        self._createJobTree(item.change, project_tree.job_trees, ret)
+        # NOTE(pabelanger): It is possible for a foreign project not to have a
+        # configured pipeline, if so return an empty JobTree.
+        if item.pipeline.name in project_config.pipelines:
+            project_tree = \
+                project_config.pipelines[item.pipeline.name].job_tree
+            self._createJobTree(item.change, project_tree.job_trees, ret)
         return ret