def test_get_odlcs(self): """We get back the odlcs we own.""" t1 = Odlc(user=self.user, odlc_type=OdlcType.standard) t1.save() t2 = Odlc(user=self.user, odlc_type=OdlcType.standard) t2.save() response = self.client.get(odlcs_url) self.assertEqual(200, response.status_code) d = json.loads(response.content) self.assertEqual([t2.json(), t1.json()], d)
def test_json(self): """Test odlc JSON.""" l = GpsPosition(latitude=38, longitude=-76) l.save() t = Odlc( user=self.user, odlc_type=OdlcType.standard, location=l, orientation=Orientation.s, shape=Shape.square, background_color=Color.white, alphanumeric='ABC', alphanumeric_color=Color.black, description='Test odlc', autonomous=True) t.save() d = t.json() self.assertIn('id', d) self.assertEqual(self.user.pk, d['user']) self.assertEqual('standard', d['type']) self.assertEqual(38, d['latitude']) self.assertEqual(-76, d['longitude']) self.assertEqual('s', d['orientation']) self.assertEqual('square', d['shape']) self.assertEqual('white', d['background_color']) self.assertEqual('ABC', d['alphanumeric']) self.assertEqual('black', d['alphanumeric_color']) self.assertEqual('Test odlc', d['description']) self.assertEqual(True, d['autonomous']) self.assertNotIn('thumbnail_approved', d) d = t.json(is_superuser=True) self.assertIn('description_approved', d) self.assertIn('thumbnail_approved', d) t.description_approved = True t.thumbnail_approved = True t.actionable_override = True t.save() d = t.json(is_superuser=True) self.assertEqual(True, d['description_approved']) self.assertEqual(None, d['thumbnail']) self.assertEqual(True, d['thumbnail_approved']) self.assertEqual(True, d['actionable_override'])
def test_get_own(self): """Test GETting a odlc owned by the correct user.""" t = Odlc(user=self.user, odlc_type=OdlcType.standard) t.save() response = self.client.get(odlcs_id_url(args=[t.pk])) self.assertEqual(200, response.status_code) self.assertEqual(t.json(), json.loads(response.content))
def test_put_append(self): """PUT sets a new field that wasn't set before.""" t = Odlc(user=self.user, odlc_type=OdlcType.standard) t.save() data = {'description': 'Hello'} response = self.client.put( odlcs_id_url(args=[t.pk]), data=json.dumps(data)) self.assertEqual(200, response.status_code) t.refresh_from_db() self.assertEqual('Hello', t.description) # Response also matches self.assertEqual(t.json(), json.loads(response.content))
def test_not_others(self): """We don't get odlcs owned by other users.""" user2 = User.objects.create_user('testuser2', '*****@*****.**', 'testpass') mine = Odlc(user=self.user, odlc_type=OdlcType.standard) mine.save() theirs = Odlc(user=user2, odlc_type=OdlcType.standard) theirs.save() response = self.client.get(odlcs_url) self.assertEqual(200, response.status_code) d = json.loads(response.content) self.assertEqual([mine.json()], d)
def test_minimal_json(self): """Test odlc JSON with minimal data.""" t = Odlc(user=self.user, odlc_type=OdlcType.standard) t.save() d = t.json() self.assertIn('id', d) self.assertEqual(self.user.pk, d['user']) self.assertEqual('standard', d['type']) self.assertEqual(None, d['latitude']) self.assertEqual(None, d['longitude']) self.assertEqual(None, d['orientation']) self.assertEqual(None, d['shape']) self.assertEqual(None, d['background_color']) self.assertEqual(None, d['alphanumeric']) self.assertEqual(None, d['alphanumeric_color']) self.assertEqual(None, d['description']) self.assertEqual(False, d['autonomous'])
def post(self, request): try: data = json.loads(request.body) except ValueError: return HttpResponseBadRequest('Request body is not valid JSON.') # Must be a json dictionary. if not isinstance(data, dict): return HttpResponseBadRequest('Request body not a JSON dict.') # Odlc type is required. if 'type' not in data: return HttpResponseBadRequest('Odlc type required.') # Team id can only be specified if superuser. user = request.user if 'team_id' in data: if request.user.is_superuser: user = User.objects.get(username=data['team_id']) else: return HttpResponseForbidden( 'Non-admin users cannot send team_id') latitude = data.get('latitude') longitude = data.get('longitude') # Require zero or both of latitude and longitude. if (latitude is not None and longitude is None) or \ (latitude is None and longitude is not None): return HttpResponseBadRequest( 'Either none or both of latitude and longitude required.') # Cannot submit JSON with actionable_override if not superuser. if 'actionable_override' in data and not request.user.is_superuser: return HttpResponseForbidden( 'Non-admin users cannot submit actionable override.') try: data = normalize_data(data) except ValueError as e: return HttpResponseBadRequest(str(e)) l = None if latitude is not None and longitude is not None: l = GpsPosition(latitude=data['latitude'], longitude=data['longitude']) l.save() # Use the dictionary get() method to default non-existent values to None. t = Odlc(user=user, odlc_type=data['type'], location=l, orientation=data.get('orientation'), shape=data.get('shape'), background_color=data.get('background_color'), alphanumeric=data.get('alphanumeric', ''), alphanumeric_color=data.get('alphanumeric_color'), description=data.get('description', ''), autonomous=data.get('autonomous', False), actionable_override=data.get('actionable_override', False)) t.save() return JsonResponse(t.json(is_superuser=request.user.is_superuser), status=201)