Ejemplo n.º 1
0
    def test_import_taplist_io_data(self):
        """Test parsing the JSON data"""
        timestamp = now()
        responses.add(
            responses.GET,
            TaplistDotIOParser.URL.format(
                self.venue_cfg.taplist_io_display_id, ),
            json=self.json_data,
            status=200,
        )
        self.assertFalse(Tap.objects.exists())
        self.assertEqual(Venue.objects.count(), 1)
        self.assertFalse(Beer.objects.exists())
        self.assertFalse(Manufacturer.objects.exists())
        mfg = ManufacturerFactory(name="InnerSpace", )
        ManufacturerAlternateName.objects.bulk_create(
            ManufacturerAlternateName(
                manufacturer=mfg,
                name=name,
            ) for name in [
                "Isb",
                "InnerSpace Brewing  Company",
                "InnerSpace Brewing co",
            ])
        for dummy in range(2):
            # running twice to make sure we're not double-creating
            args = []
            opts = {}
            call_command("parsetaplistio", *args, **opts)

            self.assertEqual(Beer.objects.count(), 10,
                             list(Beer.objects.all()))
            self.assertEqual(Manufacturer.objects.count(), 1)
            self.assertEqual(Tap.objects.count(), 13)
            taps = (Tap.objects.filter(
                venue=self.venue,
                tap_number__in=[1, 2, 10],
            ).select_related(
                "beer__style",
                "beer__manufacturer",
            ).order_by("tap_number"))
            tap = taps[0]
            self.assertEqual(tap.beer.name, "SkyFarmer Farmhouse Ale")
            self.assertEqual(tap.beer.manufacturer.name, mfg.name)
            self.assertEqual(tap.beer.style.name, "Farmhouse Ale")
            self.assertEqual(tap.time_updated, self.timestamp)
            # location nulled out in test data
            tap = taps[1]
            self.assertIsNone(tap.beer_id)
            self.assertEqual(tap.time_updated, self.timestamp)
            tap = taps[2]
            self.assertEqual(tap.beer.manufacturer.name, mfg.name)
            self.assertEqual(tap.beer.name, "Denver Destroyer")
            # NOTE: Yes, really.
            self.assertEqual(tap.beer.style.name, "An elusive IPA")
            self.assertEqual(tap.time_updated, self.timestamp)
        self.venue.refresh_from_db()
        self.assertIsNotNone(self.venue.tap_list_last_check_time)
        self.assertGreater(self.venue.tap_list_last_check_time, timestamp)
        self.assertIsNotNone(self.venue.tap_list_last_update_time)
Ejemplo n.º 2
0
 def setUpTestData(cls):
     super().setUpTestData()
     cls.manufacturer = ManufacturerFactory()
     cls.venue = VenueFactory(
         tap_list_provider=ArryvedMenuParser.provider_name)
     cls.venue_cfg = VenueAPIConfiguration.objects.create(
         venue=cls.venue,
         arryved_location_id="abc123",
         arryved_menu_id="def456",
         arryved_manufacturer_name=cls.manufacturer.name,
         arryved_serving_sizes=[
             "TAS",
             "32O",
             "64O",
             "13O",
             "PIN",
         ],
     )
     with open(
             os.path.join(
                 os.path.dirname(BASE_DIR),
                 "tap_list_providers",
                 "example_data",
                 "arryved_menu.json",
             ),
             "rb",
     ) as json_file:
         cls.json_data = json.loads(json_file.read())
Ejemplo n.º 3
0
 def setUpTestData(cls):
     super().setUpTestData()
     cls.venue = VenueFactory(
         tap_list_provider=BeerMenusParser.provider_name)
     cls.venue_cfg = VenueAPIConfiguration.objects.create(
         venue=cls.venue,
         beermenus_slug=BAD_DADDYS_SLUG,
         beermenus_categories=['on_tap', 'featured'],
     )
     cls.locations = []
     cls.main_menu = ''
     cls.read_more = ''
     for name in os.listdir(PATH):
         if name.startswith(BAD_DADDYS_SLUG):
             url = (f'https://www.beermenus.com/places/'
                    f'{name.replace("__", "?").split(".")[0]}')
             with open(os.path.join(PATH, name)) as infile:
                 html = infile.read()
             if '?' in url:
                 cls.read_more = html
             else:
                 cls.base_url = url
                 cls.main_menu = html
         else:
             url = ('https://www.beermenus.com/beers/'
                    f'{name.split(".")[0]}')
             with open(os.path.join(PATH, name)) as infile:
                 cls.locations.append((url, name, infile.read()))
     rocket = ManufacturerFactory(name='Rocket Republic Brewing Company')
     ManufacturerAlternateName.objects.create(
         name='Rocket Republic',
         manufacturer=rocket,
     )
Ejemplo n.º 4
0
 def test_guess_manufacturer_back_forty(self):
     mfg = ManufacturerFactory(name="Back Forty")
     ManufacturerAlternateName.objects.bulk_create(
         ManufacturerAlternateName(name=name, manufacturer=mfg)
         for name in ["Back Forty", "Back Forty Beer Co"])
     parser = StemAndSteinParser()
     guessed = parser.guess_beer("Back Forty Truck Stop Honey Brown")
     self.assertEqual(guessed.manufacturer, mfg)
Ejemplo n.º 5
0
 def test_twitter_handle(self):
     mfg = ManufacturerFactory(twitter_handle="abc123")
     provider = BaseTapListProvider()
     looked_up = provider.get_manufacturer(
         name=mfg.name,
         twitter_handle="https://twitter.com/foobar",
     )
     self.assertEqual(looked_up, mfg)
     self.assertEqual(looked_up.twitter_handle, "foobar")
Ejemplo n.º 6
0
 def test_mfg_duplicate_alt_name(self):
     mfg = ManufacturerFactory(name='Founders')
     ManufacturerAlternateName.objects.create(name=mfg.name,
                                              manufacturer=mfg)
     ManufacturerAlternateName.objects.create(
         name='Founders Brewing Co.',
         manufacturer=mfg,
     )
     provider = BaseTapListProvider()
     looked_up = provider.get_manufacturer(name=mfg.name)
     self.assertEqual(looked_up, mfg)
Ejemplo n.º 7
0
 def test_guess_manufacturer_goat_island(self):
     mfg_names = [
         'Horny Goat Brewing Company', 'Goat Island Brewing', 'Goat Island',
     ]
     manufacturers = [
         ManufacturerFactory.build(name=name) for name in mfg_names
     ]
     Manufacturer.objects.bulk_create(manufacturers)
     parser = StemAndSteinParser()
     guessed = parser.guess_manufacturer('Goat Island Sipsey River Red Ale')
     self.assertEqual(guessed.name, 'Goat Island', guessed)
     self.assertIn(guessed, manufacturers)
Ejemplo n.º 8
0
 def test_guess_manufacturer_good_people(self):
     mfg_names = [
         'Goodwood', 'Good People Brewing Company', 'Good People',
         'Good People Brewing Co.',
     ]
     manufacturers = [
         ManufacturerFactory.build(name=name) for name in mfg_names
     ]
     Manufacturer.objects.bulk_create(manufacturers)
     parser = StemAndSteinParser()
     guessed = parser.guess_manufacturer('Good People IPA')
     self.assertEqual(guessed.name, 'Good People', guessed)
     self.assertIn(guessed, manufacturers)
Ejemplo n.º 9
0
 def test_guess_manufacturer_stone(self):
     mfg_names = [
         'New Realm Brewing Company / Stone', 'Stone Brewing ', 'Stone',
         'Stone Brewing Co.', 'Stone Brewing',
     ]
     manufacturers = [
         ManufacturerFactory.build(name=name) for name in mfg_names
     ]
     Manufacturer.objects.bulk_create(manufacturers)
     parser = StemAndSteinParser()
     guessed = parser.guess_manufacturer('Stone Enjoy By 04.20.19 IPA')
     self.assertEqual(guessed.name, 'Stone', guessed)
     self.assertIn(guessed, manufacturers)
 def test_beers(self):
     mfg = ManufacturerFactory()
     beers = Beer.objects.bulk_create(
         BeerFactory.build(manufacturer=mfg) for dummy in range(10))
     taps = Tap.objects.bulk_create(
         Tap(
             beer=beer,
             tap_number=index + 1,
             venue=self.venue,
         ) for index, beer in enumerate(beers))
     response = self.client.get(f"{self.url}beers/")
     self.assertEqual(len(taps), len(beers))
     self.assertEqual(Beer.objects.count(), len(beers))
     self.assertEqual(response.status_code, 200, response.data)
     self.assertEqual(len(response.data["results"]), len(beers))
Ejemplo n.º 11
0
 def test_manufacturer_lookup(self):
     mfg = ManufacturerFactory(name='Stone')
     provider = BaseTapListProvider()
     for name in [
             'Stone Brewing Company',
             'Stone Brewing',
             'Stone',
             'Stone Beer Co.',
     ]:
         looked_up = provider.get_manufacturer(name)
         self.assertEqual(
             mfg,
             looked_up,
             f'{looked_up.name} does not match {name}',
         )
         self.assertEqual(Manufacturer.objects.count(), 1, name)
Ejemplo n.º 12
0
 def test_invalid_gas(self):
     self.client.force_login(self.normal_user)
     VenueTapManager.objects.create(venue=self.venue, user=self.normal_user)
     form_data = {
         "beer": BeerFactory(manufacturer=ManufacturerFactory()).id,
         "estimated_percent_remaining": 90,
         "gas_type": "xenon",
     }
     with self.assertNumQueries(12):
         response = self.client.post(self.edit_url, data=form_data)
     self.assertEqual(response.status_code, 400)
     self.assertTemplateUsed(response, "taps/tap_form.html")
     self.assertIn(
         "Select a valid choice. xenon is not one of the available choices.",
         response.content.decode("utf-8"),
     )
Ejemplo n.º 13
0
 def test_manufacturer_lookup(self):
     mfg = ManufacturerFactory(name="Stone")
     provider = BaseTapListProvider()
     for name in [
             "Stone Brewing Company",
             "Stone Brewing",
             "Stone",
             "Stone Beer Co.",
     ]:
         looked_up = provider.get_manufacturer(name)
         self.assertEqual(
             mfg,
             looked_up,
             f"{looked_up.name} does not match {name}",
         )
         self.assertEqual(Manufacturer.objects.count(), 1, name)
Ejemplo n.º 14
0
 def test_invalid_percent_remaining(self):
     self.client.force_login(self.normal_user)
     VenueTapManager.objects.create(venue=self.venue, user=self.normal_user)
     self.assertFalse(Beer.objects.exists())
     form_data = {
         "beer": BeerFactory(manufacturer=ManufacturerFactory()).id,
         "estimated_percent_remaining": 101,
         "gas_type": "co2",
     }
     with self.assertNumQueries(12):
         response = self.client.post(self.edit_url, data=form_data)
     self.assertEqual(response.status_code, 400)
     self.assertTemplateUsed(response, "taps/tap_form.html")
     self.assertIn(
         "A keg cannot be more than 100% full.",
         response.content.decode("utf-8"),
     )
Ejemplo n.º 15
0
 def setUpTestData(cls):
     super().setUpTestData()
     cls.venue = VenueFactory()
     cls.normal_user = UserFactory()
     cls.styles = Style.objects.bulk_create(StyleFactory.build_batch(50))
     cls.manufacturer = ManufacturerFactory()
     cls.beers = Beer.objects.bulk_create(
         BeerFactory.build(style=style, manufacturer=cls.manufacturer)
         for style in cls.styles)
     cls.taps = Tap.objects.bulk_create(
         TapFactory.build(
             beer=beer,
             venue=cls.venue,
             tap_number=index,
         ) for index, beer in enumerate(cls.beers))
     VenueTapManager.objects.create(
         user=cls.normal_user,
         venue=cls.venue,
     )
Ejemplo n.º 16
0
 def test_superuser_valid_form_new_tap(self):
     self.client.force_login(UserFactory(is_superuser=True))
     form_data = {
         "beer": BeerFactory(manufacturer=ManufacturerFactory()).id,
         "estimated_percent_remaining": 90,
         "gas_type": "co2",
     }
     with self.assertNumQueries(10):
         response = self.client.post(self.create_url, data=form_data)
     self.assertEqual(response.status_code, 302)
     self.assertEqual(
         response["Location"],
         reverse("venue_table", args=[self.venue.id]),
     )
     tap = Tap.objects.exclude(id=self.existing_tap.id).get()
     self.assertEqual(tap.beer_id, form_data["beer"])
     self.assertEqual(tap.estimated_percent_remaining, 90)
     self.assertEqual(tap.gas_type, "co2")
     self.assertEqual(Tap.objects.count(), 2)
Ejemplo n.º 17
0
 def test_valid_form_existing_tap(self):
     self.client.force_login(self.normal_user)
     VenueTapManager.objects.create(venue=self.venue, user=self.normal_user)
     form_data = {
         "beer": BeerFactory(manufacturer=ManufacturerFactory()).id,
         "estimated_percent_remaining": 90,
         "gas_type": "co2",
     }
     with self.assertNumQueries(12):
         response = self.client.post(self.edit_url, data=form_data)
     self.assertEqual(response.status_code, 302)
     self.assertEqual(
         response["Location"],
         reverse("venue_table", args=[self.venue.id]),
     )
     self.existing_tap.refresh_from_db()
     self.assertEqual(self.existing_tap.beer_id, form_data["beer"])
     self.assertEqual(self.existing_tap.estimated_percent_remaining, 90)
     self.assertEqual(self.existing_tap.gas_type, "co2")
     self.assertEqual(Tap.objects.count(), 1)
Ejemplo n.º 18
0
 def setUp(self):
     manufacturer = ManufacturerFactory()
     venue = VenueFactory()
     style = StyleFactory()
     self.beers = Beer.objects.bulk_create(
         BeerFactory.build(
             manufacturer=manufacturer,
             style=style,
         ) for _ in range(20))
     self.prices = BeerPrice.objects.bulk_create(
         BeerPrice(
             # pint
             serving_size_id=1,
             price=index * 2.1,
             beer=beer,
             venue=venue,
         ) for index, beer in enumerate(self.beers))
     self.taps = Tap.objects.bulk_create(
         # only for half of them
         TapFactory.build(beer=beer, venue=venue)
         for beer in self.beers[:10])
Ejemplo n.º 19
0
 def test_valid_form_remove_beer(self):
     self.client.force_login(self.normal_user)
     VenueTapManager.objects.create(venue=self.venue, user=self.normal_user)
     self.existing_tap.beer = BeerFactory(
         manufacturer=ManufacturerFactory())
     self.existing_tap.save()
     form_data = {
         "beer": "",
         "estimated_percent_remaining": 0.9,
         "gas_type": "co2",
     }
     with self.assertNumQueries(10):
         response = self.client.post(self.edit_url, data=form_data)
     self.assertEqual(response.status_code, 302)
     self.assertEqual(
         response["Location"],
         reverse("venue_table", args=[self.venue.id]),
     )
     tap = Tap.objects.get()
     self.assertIsNone(tap.beer)
     self.assertIsNone(tap.estimated_percent_remaining)
     self.assertEqual(tap.gas_type, "")
Ejemplo n.º 20
0
 def test_multi_beer_more_to_come(self, mock_retry, mock_api):
     mfg = ManufacturerFactory()
     beers = Beer.objects.bulk_create(
         BeerFactory.build(manufacturer=mfg, style=None)
         for dummy in range(20))
     Tap.objects.bulk_create(
         TapFactory.build(venue=self.venue, beer=beer) for beer in beers)
     with self.settings_context_manager():
         tweet_about_beers([i.id for i in beers])  # pylint: disable=no-value-for-parameter
     beers = beers[:10]
     mock_retry.assert_not_called()
     mock_api.assert_called_once_with(
         consumer_key=self.consumer_key,
         consumer_secret=self.consumer_secret,
         access_token_key=self.api_key,
         access_token_secret=self.api_secret,
     )
     mock_api.return_value.PostUpdates.assert_called_once()
     mock_api.return_value.PostUpdate.assert_not_called()
     call_args = mock_api.return_value.PostUpdates.call_args
     self.assertEqual(call_args[1], {"continuation": "…", "threaded": True})
     self.assertEqual(len(call_args[0]), 1)
     tweet = call_args[0][0]
     self.assertIn(
         MULTI_BEER_OUTER.format(len(beers), "(10 still to come!)").strip(),
         tweet,
     )
     lines = tweet.splitlines()
     self.assertEqual(len(lines), 1 + len(beers))
     for beer, line in zip(beers, lines[1:]):
         self.assertIn(
             MULTI_BEER_INNER.format(
                 beer.name,
                 "@" + beer.manufacturer.twitter_handle,
                 "unknown",
                 self.venue.name,
             ),
             line,
         )
Ejemplo n.º 21
0
 def setUpTestData(cls):
     super().setUpTestData()
     cls.manufacturer = ManufacturerFactory(name="Cahaba")
     cls.venue = VenueFactory(
         tap_list_provider=ArryvedPOSParser.provider_name)
     cls.venue_cfg = VenueAPIConfiguration.objects.create(
         venue=cls.venue,
         arryved_location_id="abc123",
         arryved_pos_menu_names=["Growlers and Crowlers"],
         arryved_manufacturer_name=cls.manufacturer.name,
         arryved_serving_sizes=["32O", "64o"],
     )
     with open(
             os.path.join(
                 os.path.dirname(BASE_DIR),
                 "tap_list_providers",
                 "example_data",
                 "cahaba.json",
             ),
             "rb",
     ) as json_file:
         cls.json_data = json.loads(json_file.read())
Ejemplo n.º 22
0
 def test_multi_beer(self, mock_retry, mock_api):
     mfg = ManufacturerFactory()
     beers = Beer.objects.bulk_create(
         BeerFactory.build(manufacturer=mfg, style=None) for dummy in range(10)
     )
     Tap.objects.bulk_create(
         TapFactory.build(venue=self.venue, beer=beer)
         for beer in beers
     )
     with self.settings_context_manager():
         tweet_about_beers([i.id for i in beers])
     mock_retry.assert_not_called()
     mock_api.assert_called_once_with(
         consumer_key=self.consumer_key,
         consumer_secret=self.consumer_secret,
         access_token_key=self.api_key,
         access_token_secret=self.api_secret,
     )
     mock_api.return_value.PostUpdates.assert_called_once()
     mock_api.return_value.PostUpdate.assert_not_called()
     call_args = mock_api.return_value.PostUpdates.call_args
     self.assertEqual(call_args[1], {'continuation': '…', 'threaded': True})
     self.assertEqual(len(call_args[0]), 1)
     tweet = call_args[0][0]
     self.assertIn(
         MULTI_BEER_OUTER.format(len(beers), '').strip(),
         tweet,
     )
     lines = tweet.splitlines()
     self.assertEqual(len(lines), 1 + len(beers))
     for beer, line in zip(beers, lines[1:]):
         self.assertIn(MULTI_BEER_INNER.format(
             beer.name,
             '@' + beer.manufacturer.twitter_handle,
             'unknown',
             self.venue.name,
         ), line)
Ejemplo n.º 23
0
 def setUpTestData(cls) -> None:
     cls.normal_user = UserFactory()
     cls.venue = VenueFactory()
     cls.existing_tap = TapFactory(venue=cls.venue)
     cls.manufacturers = Manufacturer.objects.bulk_create(
         ManufacturerFactory.build_batch(2))
Ejemplo n.º 24
0
    def test_import_stemandstein_data(self):
        """Test parsing the JSON data"""
        for pk, html_data in self.html_data.items():
            if pk == "root":
                url = "https://thestemandstein.com/"
            else:
                url = f"https://thestemandstein.com/Home/BeerDetails/{pk}"
            responses.add(responses.GET, url, body=html_data, status=200)
        self.assertFalse(Tap.objects.exists())
        self.assertEqual(Venue.objects.count(), 1)
        self.assertFalse(Beer.objects.exists())
        self.assertFalse(Manufacturer.objects.exists())
        deleted_tap = Tap.objects.create(
            venue=self.venue,
            tap_number=3000,
        )
        mfg = ManufacturerFactory(name="Founders")
        beer = BeerFactory(name="Dirty Bastard", manufacturer=mfg)
        other = Style.objects.create(name="other")
        # Create a fake shorter style name that the search for fruit ale should
        # ignore
        StyleAlternateName.objects.create(name="t Ale", style=other)
        style = Style.objects.create(name="Fruit Beer")
        StyleAlternateName.objects.create(name="Fruit Ale", style=style)
        for dummy in range(2):
            # running twice to make sure we're not double-creating
            args = []
            opts = {}
            call_command("parsestemandstein", *args, **opts)

            self.assertEqual(Beer.objects.count(), 17)
            # Bell's and Founders have two each
            self.assertEqual(Manufacturer.objects.count(), 15)
            self.assertEqual(Tap.objects.count(), 17)
            taps = (Tap.objects.filter(
                venue=self.venue,
                tap_number__in=[1, 3, 9, 17],
            ).select_related(
                "beer__style",
                "beer__manufacturer",
            ).order_by("tap_number"))
            tap = taps[0]
            self.assertTrue(
                tap.beer.name.endswith("Space Blood Orange Cider"),
                tap.beer.name,
            )
            self.assertEqual(tap.beer.manufacturer.location, "Sebastopol, CA")
            self.assertEqual(tap.beer.abv, Decimal("6.9"))
            self.assertEqual(tap.beer.stem_and_stein_pk, 967)
            prices = list(tap.beer.prices.all())
            self.assertEqual(len(prices), 1)
            price = prices[0]
            self.assertEqual(price.price, 5)
            self.assertEqual(price.serving_size.volume_oz, 16)
            tap = taps[3]
            # this one ends with an asterisk. Make sure it's stripped.
            self.assertTrue(
                tap.beer.name.endswith("Karmeliet"),
                tap.beer.name,
            )
            self.assertEqual(tap.beer.manufacturer.location, "Belgium")
            prices = list(tap.beer.prices.all())
            self.assertEqual(len(prices), 1)
            price = prices[0]
            self.assertEqual(price.price, 8)
            self.assertEqual(price.serving_size.volume_oz, 10)
            self.assertFalse(Tap.objects.filter(id=deleted_tap.id).exists())
            # make sure style stripping works
            tap = taps[2]
            self.assertEqual(tap.beer.style.name, "Scotch Ale")
            self.assertEqual(tap.beer.name, "Dirty Bastard")
            self.assertEqual(tap.beer.id, beer.id)
            self.assertEqual(tap.beer.manufacturer_id, mfg.id)
            tap = taps[1]
            # style is set to Fruit Ale but the beer name is preserved
            self.assertEqual(tap.beer.style_id, style.id)
            self.assertTrue(tap.beer.name.endswith("Fruit Ale"))