diff --git a/api/migrations/0002_auto_20200426_1517.py b/api/migrations/0002_auto_20200426_1517.py new file mode 100644 index 0000000..8729d7a --- /dev/null +++ b/api/migrations/0002_auto_20200426_1517.py @@ -0,0 +1,25 @@ +# Generated by Django 3.0.5 on 2020-04-26 15:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Visitor', + fields=[ + ('name', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('clicked', models.IntegerField(blank=True, default=0)), + ('first_pressed', models.DateTimeField(auto_now_add=True)), + ('last_pressed', models.DateTimeField(auto_now=True)), + ], + ), + migrations.DeleteModel( + name='Snippet', + ), + ] diff --git a/api/migrations/0003_auto_20200426_1526.py b/api/migrations/0003_auto_20200426_1526.py new file mode 100644 index 0000000..5085b1a --- /dev/null +++ b/api/migrations/0003_auto_20200426_1526.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.5 on 2020-04-26 15:26 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0002_auto_20200426_1517'), + ] + + operations = [ + migrations.AlterField( + model_name='visitor', + name='first_pressed', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='visitor', + name='last_pressed', + field=models.DateTimeField(blank=True, null=True), + ), + ] diff --git a/api/models.py b/api/models.py index 16f8cd6..eea1bf4 100644 --- a/api/models.py +++ b/api/models.py @@ -1,19 +1,11 @@ from django.db import models -from pygments.lexers import get_all_lexers -from pygments.styles import get_all_styles +from datetime import datetime -LEXERS = [item for item in get_all_lexers() if item[1]] -LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS]) -STYLE_CHOICES = sorted([(item, item) for item in get_all_styles()]) - - -class Snippet(models.Model): - created = models.DateTimeField(auto_now_add=True) - title = models.CharField(max_length=100, blank=True, default='') - code = models.TextField() - linenos = models.BooleanField(default=False) - language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100) - style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100) - - class Meta: - ordering = ['created'] \ No newline at end of file +class Visitor(models.Model): + name = models.CharField( + primary_key=True, + max_length = 255 + ) + clicked = models.IntegerField(default = 0, blank=True) + first_pressed = models.DateTimeField(blank=True, null=True) + last_pressed = models.DateTimeField(blank=True, null=True) \ No newline at end of file diff --git a/api/serializers.py b/api/serializers.py index 6917192..1eb55d9 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -1,29 +1,23 @@ from rest_framework import serializers -from .models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES +from .models import * -class SnippetSerializer(serializers.Serializer): - id = serializers.IntegerField(read_only=True) - title = serializers.CharField(required=False, allow_blank=True, max_length=100) - code = serializers.CharField(style={'base_template': 'textarea.html'}) - linenos = serializers.BooleanField(required=False) - language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python') - style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly') +class VisitorSerializer(serializers.Serializer): + name = serializers.CharField(required=True) + clicked = serializers.IntegerField(read_only=True) + first_pressed = serializers.DateTimeField(read_only=True) + last_pressed = serializers.DateTimeField(read_only=True) def create(self, validated_data): """ - Create and return a new `Snippet` instance, given the validated data. + Create and return a new `Visitor` instance, given the validated data. """ - return Snippet.objects.create(**validated_data) + return Visitor.objects.create(**validated_data) def update(self, instance, validated_data): """ Update and return an existing `Snippet` instance, given the validated data. """ - instance.title = validated_data.get('title', instance.title) - instance.code = validated_data.get('code', instance.code) - instance.linenos = validated_data.get('linenos', instance.linenos) - instance.language = validated_data.get('language', instance.language) - instance.style = validated_data.get('style', instance.style) + instance.name = validated_data.get('name', instance.name) instance.save() return instance \ No newline at end of file diff --git a/api/tests.py b/api/tests.py index c12600d..e988a38 100644 --- a/api/tests.py +++ b/api/tests.py @@ -1,42 +1,53 @@ from django.contrib.auth.models import AnonymousUser, User from django.test import RequestFactory, TestCase +from django.db.utils import IntegrityError -from .views import SnippetList, SnippetDetail +from .views import * class SimpleTest(TestCase): def setUp(self): # Every test needs access to the request factory. self.factory = RequestFactory() - self.user = User.objects.create_user( - username='testuser', email='test@test.test', password='testpass') + # self.user = User.objects.create_user( + # username='testuser', email='test@test.test', password='testpass') - def test_snippets(self): + def test_list_visitors(self): # Create an instance of a GET request. - request = self.factory.get('/snippets') + request = self.factory.get('/visitors') # Recall that middleware are not supported. You can simulate a # logged-in user by setting request.user manually. - request.user = self.user + # request.user = self.user # Or you can simulate an anonymous user by setting request.user to # an AnonymousUser instance. # request.user = AnonymousUser() # Test my_view() as if it were deployed at /customer/details - response = SnippetList.as_view()(request) + response = VisitorList.as_view()(request) # Use this syntax for class-based views. # response = MyView.as_view()(request) self.assertEqual(response.status_code, 200) - request = self.factory.post('/snippets', data={ - 'title': 'test1', - 'code': '() => {console.log("hello")};', - 'lineos': False, - 'language': 'js', - 'style': 'abap' + def test_add_visitor(self): + request = self.factory.post('/visitors', data={ + 'name': 'test', }, content_type='application/json' ) - response = SnippetList.as_view()(request) - self.assertEqual(response.status_code, 201) \ No newline at end of file + response = VisitorList.as_view()(request) + self.assertEqual(response.status_code, 201) + + vis = Visitor.objects.get(name='test') + self.assertEqual(vis.clicked, 0) + self.assertIsNone(vis.first_pressed) + self.assertIsNone(vis.last_pressed) + + with self.assertRaises(IntegrityError): + request = self.factory.post('/visitors', data={ + 'name': 'test', + }, + content_type='application/json' + ) + response = VisitorList.as_view()(request) diff --git a/api/urls.py b/api/urls.py index 96dea15..e6400fd 100644 --- a/api/urls.py +++ b/api/urls.py @@ -3,8 +3,8 @@ from rest_framework.urlpatterns import format_suffix_patterns from . import views urlpatterns = [ - path('snippets/', views.SnippetList.as_view()), - path('snippets//', views.SnippetDetail.as_view()), + path('visitor/', views.VisitorList.as_view()), + path('visitor//', views.VisitorDetail.as_view()), ] urlpatterns = format_suffix_patterns(urlpatterns) \ No newline at end of file diff --git a/api/views.py b/api/views.py index 09ca733..b6609c8 100644 --- a/api/views.py +++ b/api/views.py @@ -1,15 +1,15 @@ -from .models import Snippet -from .serializers import SnippetSerializer +from .models import * +from .serializers import * from rest_framework import generics -class SnippetList(generics.ListCreateAPIView): +class VisitorList(generics.ListCreateAPIView): # Add comments here - queryset = Snippet.objects.all() - serializer_class = SnippetSerializer + queryset = Visitor.objects.all() + serializer_class = VisitorSerializer -class SnippetDetail(generics.RetrieveUpdateDestroyAPIView): +class VisitorDetail(generics.RetrieveUpdateDestroyAPIView): # Add comments here - queryset = Snippet.objects.all() - serializer_class = SnippetSerializer \ No newline at end of file + queryset = Visitor.objects.all() + serializer_class = VisitorSerializer \ No newline at end of file diff --git a/config/urls.py b/config/urls.py index 34eba79..559a010 100644 --- a/config/urls.py +++ b/config/urls.py @@ -18,7 +18,7 @@ from django.urls import path, include from django.http import JsonResponse urlpatterns = [ - # path('api/', include('api.urls')), + path('api/', include('api.urls')), path('', include('ui.urls')), # path('admin/', admin.site.urls), ] diff --git a/ui/tests.py b/ui/tests.py index c5c5eec..b6f66ff 100644 --- a/ui/tests.py +++ b/ui/tests.py @@ -11,13 +11,13 @@ class SimpleTest(TestCase): username='testuser', email='test@test.test', password='testpass') def test_button(self): - # Create an instance of a GET request. - request = self.factory.get('/snippets') - request.user = self.user + # Test button page returns 200 + request = self.factory.get('/button') request.session = self.client.session response = button(request) self.assertEqual(response.status_code, 200) + # Test button post returns 200 and increments button to 1 request = self.factory.post( '/button', data={}, @@ -28,6 +28,7 @@ class SimpleTest(TestCase): self.assertEqual(response.status_code, 200) self.assertEqual(request.session.get('pressed'), 1) + # Test second click increments button to 2 response = button(request) self.assertEqual(response.status_code, 200) self.assertEqual(request.session.get('pressed'), 2) \ No newline at end of file