mirror of
https://github.com/fspc/workstand.git
synced 2025-04-04 10:03:22 -04:00
Add endpoint to check cpic.
This commit is contained in:
parent
1e0f1cd496
commit
63ff3f5ce7
@ -4,17 +4,18 @@ from typing import Dict, Union, Optional
|
||||
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
from channels import Channel
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.utils import timezone
|
||||
|
||||
from bike.models import Bike
|
||||
|
||||
logger = logging.getLogger('cpic')
|
||||
logger = logging.getLogger('bikeshop')
|
||||
|
||||
|
||||
def _is_stolen(serial: str) -> Optional[bool]:
|
||||
url = 'http://app.cpic-cipc.ca/English/searchFormResultsbikes.cfm'
|
||||
data = {'ser': message.get('serial_number'),
|
||||
data = {'ser': serial,
|
||||
'toc': 1,
|
||||
'Submit': 'Begin Search'}
|
||||
|
||||
@ -55,6 +56,7 @@ def check_cpic(message: Dict[str, Union[str, int]]) -> None:
|
||||
bike.stolen = False
|
||||
|
||||
bike.save()
|
||||
response = {'stolen': stolen}
|
||||
response.update(message)
|
||||
|
||||
|
||||
|
||||
Channel('check-cpic').send(response)
|
||||
|
@ -1,4 +1,7 @@
|
||||
from decimal import Decimal
|
||||
|
||||
from channels import Channel
|
||||
from channels.tests import ChannelTestCase
|
||||
from django.test import TestCase
|
||||
from model_mommy import timezone
|
||||
|
||||
@ -12,7 +15,7 @@ from .models import Bike, BikeState
|
||||
from unittest.mock import patch
|
||||
|
||||
|
||||
class TestGet(TestCase):
|
||||
class TestBikeApi(TestCase):
|
||||
def setUp(self):
|
||||
self.user = mommy.make('registration.CustomUser', is_admin=True, is_superuser=True)
|
||||
|
||||
@ -77,7 +80,6 @@ class TestGet(TestCase):
|
||||
|
||||
self.assertEqual(result.status_code, status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
def test_assessed_cannot_transition(self):
|
||||
data = {
|
||||
"colour": "black",
|
||||
@ -347,6 +349,18 @@ class TestGet(TestCase):
|
||||
|
||||
self.assertEqual(result.status_code, status.HTTP_200_OK)
|
||||
|
||||
@patch('bike.consumers.check_cpic')
|
||||
def test_check_cpic(self, check_cpic_mock):
|
||||
bike = mommy.make(model=Bike, cpic_searched_at=None, stolen=None)
|
||||
client = APIClient()
|
||||
client.force_authenticate(user=self.user, token='blah')
|
||||
data = {'serial_number': '123abc'}
|
||||
result = client.put(f'/api/v1/bikes/{bike.id}/check/', data=data)
|
||||
|
||||
self.assertEqual(result.status_code, status.HTTP_200_OK)
|
||||
self.assertEqual(result.data, {'status': 'pending'})
|
||||
check_cpic_mock.assert_called_once()
|
||||
|
||||
|
||||
class TestBikeSignals(TestCase):
|
||||
@patch('bike.consumers._is_stolen')
|
||||
@ -372,3 +386,24 @@ class TestBikeSignals(TestCase):
|
||||
|
||||
self.assertFalse(updated_bike.stolen)
|
||||
self.assertIsNotNone(updated_bike.cpic_searched_at)
|
||||
|
||||
|
||||
class TestBikeCheckCpic(ChannelTestCase):
|
||||
@patch('bike.consumers._is_stolen')
|
||||
def test_start_check(self, is_stolen_mock):
|
||||
is_stolen_mock.return_value = False
|
||||
bike = mommy.make(Bike)
|
||||
message = {'bike_id': bike.id, 'serial_number': bike.serial_number}
|
||||
|
||||
Channel('check-cpic').send(message)
|
||||
check_cpic(self.get_next_message('check-cpic', require=True))
|
||||
|
||||
result = self.get_next_message('check-cpic', require=True)
|
||||
|
||||
updated_bike = Bike.objects.get(id=bike.id)
|
||||
|
||||
self.assertFalse(updated_bike.stolen)
|
||||
self.assertIsNotNone(updated_bike.cpic_searched_at)
|
||||
self.assertFalse(result['stolen'])
|
||||
self.assertEqual(result['bike_id'], message['bike_id'])
|
||||
self.assertEqual(result['serial_number'], message['serial_number'])
|
||||
|
@ -1,3 +1,5 @@
|
||||
import logging
|
||||
from channels import Channel
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.utils.decorators import method_decorator
|
||||
@ -15,6 +17,8 @@ from rest_framework import status
|
||||
|
||||
from registration.models import Member
|
||||
|
||||
logger = logging.getLogger('bikeshop')
|
||||
|
||||
|
||||
@method_decorator(login_required, name='dispatch')
|
||||
class BikesView(TemplateView):
|
||||
@ -107,3 +111,10 @@ class BikeViewSet(viewsets.ModelViewSet):
|
||||
|
||||
serializer = BikeSerializer(bike, context={'request': request})
|
||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||
|
||||
@detail_route(methods=['put'])
|
||||
def check(self, request, pk):
|
||||
message = {'bike_id': pk, 'serial_number': request.data.get('serial_number')}
|
||||
Channel('check-cpic').send(message)
|
||||
|
||||
return Response({'status': 'pending'})
|
||||
|
Loading…
x
Reference in New Issue
Block a user