From 0b306fd59edc1d20617903fdc4ab6fe417d4a578 Mon Sep 17 00:00:00 2001
From: Christopher Neugebauer <chrisjrn@gmail.com>
Date: Sun, 4 Sep 2016 13:41:49 +1000
Subject: [PATCH] Adds test for user being a primary presenter of a proposal

---
 registrasion/controllers/conditions.py |  4 +-
 registrasion/tests/test_speaker.py     | 89 +++++++++++++++++++++++++-
 2 files changed, 89 insertions(+), 4 deletions(-)

diff --git a/registrasion/controllers/conditions.py b/registrasion/controllers/conditions.py
index 831faa78..f9007096 100644
--- a/registrasion/controllers/conditions.py
+++ b/registrasion/controllers/conditions.py
@@ -310,4 +310,6 @@ class SpeakerConditionController(IsMetByFilter, ConditionController):
         ''' Returns all of the items from queryset which are enabled by a user
         being a presenter or copresenter of a proposal. '''
 
-        return queryset
+        # User is a presenter
+
+        return queryset.filter(proposal_kind__section__presentations__speaker__user=user)
diff --git a/registrasion/tests/test_speaker.py b/registrasion/tests/test_speaker.py
index 15a614c8..0262561d 100644
--- a/registrasion/tests/test_speaker.py
+++ b/registrasion/tests/test_speaker.py
@@ -12,6 +12,7 @@ from registrasion.controllers.product import ProductController
 from symposion.conference import models as conference_models
 from symposion.proposals import models as proposal_models
 from symposion.speakers import models as speaker_models
+from symposion.reviews.models import promote_proposal
 
 from test_cart import RegistrationCartTestCase
 
@@ -97,6 +98,32 @@ class SpeakerTestCase(RegistrationCartTestCase):
         cls.PROPOSAL_1 = proposal_1
         cls.PROPOSAL_2 = proposal_2
 
+    @classmethod
+    def _create_flag_for_primary_speaker(cls):
+        ''' Adds flag -- PROD_1 is not available unless user is a primary
+        presenter of a KIND_1 '''
+        flag = conditions.SpeakerFlag.objects.create(
+            description="User must be presenter",
+            condition=conditions.FlagBase.ENABLE_IF_TRUE,
+            is_presenter=True,
+            is_copresenter=False,
+        )
+        flag.proposal_kind.add(cls.KIND_1)
+        flag.products.add(cls.PROD_1)
+
+    @classmethod
+    def _create_flag_for_additional_speaker(cls):
+        ''' Adds flag -- PROD_1 is not available unless user is a primary
+        presenter of a KIND_2 '''
+        flag = conditions.SpeakerFlag.objects.create(
+            description="User must be copresenter",
+            condition=conditions.FlagBase.ENABLE_IF_TRUE,
+            is_presenter=False,
+            is_copresenter=True,
+        )
+        flag.proposal_kind.add(cls.KIND_1)
+        flag.products.add(cls.PROD_1)
+
     def test_create_proposals(self):
         self._create_proposals()
 
@@ -106,10 +133,66 @@ class SpeakerTestCase(RegistrationCartTestCase):
         self.assertIsNotNone(self.PROPOSAL_2)
 
     def test_primary_speaker_enables_item(self):
-        raise NotImplementedError()
+        self._create_proposals()
+        self._create_flag_for_primary_speaker()
+
+        # USER_1 cannot see PROD_1 until proposal is promoted.
+        available = ProductController.available_products(
+            self.USER_1,
+            products=[self.PROD_1],
+        )
+        self.assertNotIn(self.PROD_1, available)
+
+        # promote proposal_1 so that USER_1 becomes a speaker
+        promote_proposal(self.PROPOSAL_1)
+
+        # USER_1 can see PROD_1
+        available_1 = ProductController.available_products(
+            self.USER_1,
+            products=[self.PROD_1],
+        )
+        self.assertIn(self.PROD_1, available_1)
+        # USER_2 can *NOT* see PROD_1 because they're a copresenter
+        available_2 = ProductController.available_products(
+            self.USER_2,
+            products=[self.PROD_1],
+        )
+        self.assertNotIn(self.PROD_1, available_2)
 
     def test_additional_speaker_enables_item(self):
-        raise NotImplementedError()
+        self._create_proposals()
+        self._create_flag_for_additional_speaker()
+
+        # USER_2 cannot see PROD_1 until proposal is promoted.
+        available = ProductController.available_products(
+            self.USER_2,
+            products=[self.PROD_1],
+        )
+        self.assertNotIn(self.PROD_1, available)
+
+        # promote proposal_1 so that USER_2 becomes an additional speaker
+        promote_proposal(self.PROPOSAL_1)
+
+        # USER_2 can see PROD_1
+        available_2 = ProductController.available_products(
+            self.USER_2,
+            products=[self.PROD_1],
+        )
+        self.assertIn(self.PROD_1, available_2)
+        # USER_1 can *NOT* see PROD_1 because they're a presenter
+        available_1 = ProductController.available_products(
+            self.USER_1,
+            products=[self.PROD_1],
+        )
+        self.assertNotIn(self.PROD_1, available_1)
 
     def test_speaker_on_different_proposal_kind_does_not_enable_item(self):
-        raise NotImplementedError()
+        self._create_proposals()
+        self._create_flag_for_primary_speaker()
+
+        # USER_1 cannot see PROD_1 until proposal is promoted.
+
+        # promote proposal_2 so that USER_1 becomes a speaker, but of
+        # KIND_2, which is not covered by this condition
+
+        # USER_2 cannot see PROD_1