Beispiel #1
0
def ask(request):
    if request.method == 'POST':
        form = create_ask_form(request.POST)
        if form.is_valid():
            print(request.user.id)
            data = form.cleaned_data
            tags = data['tags'].replace(" ","").split(",")
            q = Question.objects.create( 
                title = data['title'], 
                text_qest = data['text'], 
                count_ans = 0, 
                rating = 0, 
                author_id = request.user.id
                )
            for tag in tags:
                if len(tag) > 0:
                    try:
                        currentTag = Tags.objects.get(name = tag.lower())
                    except:
                        currentTag = Tags(name = tag.lower())
                        currentTag.save()
                    q.tags.add(currentTag)
            return HttpResponseRedirect(reverse('question', kwargs={'question_id': q.id}))
    else:
        form = create_ask_form()
    return render(request, 'ask/ask.html', {'form': form})
Beispiel #2
0
    def setUp(self):
        self.testbed = testbed.Testbed()
        # Then activate the testbed, which prepares the service stubs for use.
        self.testbed.activate()
        # Next, declare which service stubs you want to use.
        self.testbed.init_datastore_v3_stub()
        # enable memcache
        self.testbed.init_memcache_stub()

        self.testbed.init_user_stub(enable=True)

        self.testbed.init_search_stub(enable=True)

        self.testbed.init_urlfetch_stub()

        self.testbed.init_app_identity_stub()
        self.testbed.init_blobstore_stub()

        self.testbed.setup_env(
            USER_EMAIL='*****@*****.**',
            USER_ID='123',
            USER_IS_ADMIN='1',
            overwrite=True)

        # Clear ndb's in-context cache between tests.
        # This prevents data from leaking between tests.
        # Alternatively, you could disable caching by
        # using ndb.get_context().set_cache_policy(False)
        ndb.get_context().clear_cache()

        self.tags = Tags()
        self.categories = Categories()
        self.posts = Posts()
        self.form = PostForm()
Beispiel #3
0
def create(request):
    if request.method == "POST":
        form = (request.POST)
        user = Users.objects.get(user_id=request.user.id)
        article = Articles(user=user,
                           title=form["title"],
                           body=form["body"],
                           status=form['status'])
        article.save()
        if len(form["tags"]) > 0:
            tags = form["tags"].split(",")
            for tag in tags:
                query_set = Tags.objects.filter(tag_name=tag)
                if query_set.exists():
                    mapping = ArticleTagMapping(article_id=article.id,
                                                tag_id=query_set[0].id)
                else:
                    tag = Tags(tag_name=tag)
                    tag.save()
                    mapping = ArticleTagMapping(article_id=article.id,
                                                tag_id=tag.id)
                mapping.save()
        messages.info(
            request,
            "New article has been created with title {}".format(form["title"]))
        return HttpResponseRedirect("/create")
    else:
        return (render(request, "createArticle.html"))
Beispiel #4
0
 def fill_tags(self):
     if Tags.objects.count() > 0:
         return
     fake = Faker()
     random_tags = fake.words(nb=10, ext_word_list=None)
     for tag in random_tags:
         t = Tags()
         t.name = tag
         t.save()
         self.stdout.write('add tag [%s]' % tag)
Beispiel #5
0
    def setUp(self):
        self.testbed = testbed.Testbed()
        # Then activate the testbed, which prepares the service stubs for use.
        self.testbed.activate()
        # Next, declare which service stubs you want to use.
        self.testbed.init_datastore_v3_stub()
        # enable memcache
        self.testbed.init_memcache_stub()

        self.testbed.init_user_stub(enable=True)

        self.testbed.init_search_stub(enable=True)

        self.testbed.setup_env(
            USER_EMAIL='*****@*****.**',
            USER_ID='123',
            USER_IS_ADMIN='1',
            overwrite=True)

        # Clear ndb's in-context cache between tests.
        # This prevents data from leaking between tests.
        # Alternatively, you could disable caching by
        # using ndb.get_context().set_cache_policy(False)
        ndb.get_context().clear_cache()

        self.tags = Tags()
        self.categories = Categories()
        self.posts = Posts()
        self.form = PostForm()
        self.uploadform = UploadForm()
Beispiel #6
0
def add_tag(request):
    tag_form = TagsForm(request.POST or None)
    if request.POST:
        if tag_form.is_valid():
            tags = str(request.POST.get('tag_name')).split()
            for i in tags:
                tag = Tags()
                match = re.match(r'^[A-Za-z]+$', i)
                if match:
                    tag.tag_name = i
                    try:
                        tag.save()
                    except:
                        pass
            return redirect('post_new')
    return {'tag_form': tag_form}
Beispiel #7
0
    def setUp(self):
        self.testbed = testbed.Testbed()
        # Then activate the testbed, which prepares the service stubs for use.
        self.testbed.activate()
        # Next, enable csrf for proper rendering of forms
        self.app.config['WTF_CSRF_ENABLED'] = True
        self.testbed.init_user_stub()

        self.testbed.init_blobstore_stub()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_app_identity_stub()

        self.testbed.init_urlfetch_stub()
        # enable memcache
        self.testbed.init_memcache_stub()
        self.categories = Categories()
        self.tags = Tags()
Beispiel #8
0
 def get_context_data(self, **kwargs):
     # Call the base implementation first to get a context
     context = super(Admin_Ajax_Blog_Tags_IndexController, self).get_context_data(**kwargs)
     # Add in a QuerySet of all the books
     q = Tags.all()
     results = q.fetch(None)
     context = to_list(results)
     return context
Beispiel #9
0
 def get(self, request, slug, *arg, **kwargs):
     context = self.get_context_data(**kwargs)
     """
     return the post list
     """
     tags = Tags.all().filter("tag =", slug).get()
     posttags = PostsTags.all().filter("tag =", tags).fetch(None)
     results = []
     for posts in posttags:
         results.append(posts.post)
     context['posts'] = results
     return self.render_to_response(context)
Beispiel #10
0
def save(request, slug):
    if request.method == "POST":
        form = (request.POST)
        tags = form["tags"].split(",")
        id = Articles.objects.get(slug=slug).id
        ArticleTagMapping.objects.filter(article_id=id).delete()
        for i in tags:
            if i != '':
                query_set = Tags.objects.filter(tag_name=i)
                if query_set.exists():
                    mapping = ArticleTagMapping(article_id=id,
                                                tag_id=query_set[0].id)
                else:
                    tag = Tags(tag_name=i)
                    tag.save()
                    mapping = ArticleTagMapping(article_id=id, tag_id=tag.id)
                mapping.save()
        Articles.objects.select_related().filter(id=id).update(
            title=form['title'], body=form['body'], status=form['status'])
        messages.info(
            request,
            "Article has been updated with title {}".format(form["title"]))
        prev = request.POST.get('prev', '/')
        return (HttpResponseRedirect(prev))
Beispiel #11
0
 def form_valid(self, form):
     q = Posts(
           author=self.request.user,
           title=form.cleaned_data['title'],
           slug=str(slugify(form.cleaned_data['title'])),
           body=form.cleaned_data['body'],
           is_active=form.cleaned_data['is_active'],
           created=datetime.datetime.now().date())
     q.put()
     
     tags = self.request.POST.get('tags', False)
     if tags:
         splitted_tags = tags.split(",")
         for split in splitted_tags:
             result = Tags.all().filter("tag =", split).get()
             if result is None:
                 result = Tags(tag=split).put()
             PostsTags(tag=result, post=q).put()
             
     categories = form.cleaned_data['cat']
     if categories:
         for split in categories:
             if "-" in split:
                 #this is a parent value
                 parent_children_array = split.split("-")
                 result = Categories.get_by_id(int(parent_children_array[1]), parent=Categories.get_by_id(int(parent_children_array[0])))
             else:
                 result = Categories.get_by_id(int(split))
                 
             if result is not None:
                 PostsCategories(category=result, post=q).put()
     
     #add images
     short_image = self.request.FILES.get('short_image', False)
     large_image = self.request.FILES.get('large_image', False)
     
     if short_image:
         q.small_image = Images(content=db.Blob(short_image.read())).put()
         q.put()
     if large_image:
         q.large_image = Images(content=db.Blob(large_image.read())).put()
         q.put()
     
     return super(Admin_Blog_Posts_AddController, self).form_valid(form)
Beispiel #12
0
 def form_valid(self, form):
     q = Pages(
           author=self.request.user,
           title=form.cleaned_data['title'],
           slug=str(slugify(form.cleaned_data['title'])),
           body=form.cleaned_data['body'],
           is_active=form.cleaned_data['is_active'],
           created=datetime.datetime.now().date())
     q.put()
     if form.cleaned_data['menu']:
         #put the page to the menu
         menu_base = Menu.get_by_id(int(form.cleaned_data['menu']))
         q = MenuItems(
               menu=menu_base,
               title = form.cleaned_data['menu_label'],
               namespc = "cms",
               view = "page",
               parameters = [str(slugify(form.cleaned_data['title']))],
               is_root=True).put()
               
     tags = self.request.POST.get('tags', False)
     if tags:
         splitted_tags = tags.split(",")
         for split in splitted_tags:
             result = Tags.all().filter("tag =", split).get()
             if result is None:
                 result = Tags(tag=split).put()
             PagesTags(tag=result, page=q).put()
     
     #add images
     large_image = self.request.FILES.get('large_image', False)
     
     if large_image:
         q.large_image = Images(content=db.Blob(large_image.read())).put()
         q.put()
     
     return super(Admin_Cms_Pages_AddController, self).form_valid(form)
Beispiel #13
0
class TestViews(BlogTestBase):
    maxDiff = None

    def setUp(self):
        self.testbed = testbed.Testbed()
        # Then activate the testbed, which prepares the service stubs for use.
        self.testbed.activate()
        # Next, declare which service stubs you want to use.
        self.testbed.init_datastore_v3_stub()
        # enable memcache
        self.testbed.init_memcache_stub()

        self.testbed.init_user_stub(enable=True)

        self.testbed.init_search_stub(enable=True)

        self.testbed.setup_env(
            USER_EMAIL='*****@*****.**',
            USER_ID='123',
            USER_IS_ADMIN='1',
            overwrite=True)

        # Clear ndb's in-context cache between tests.
        # This prevents data from leaking between tests.
        # Alternatively, you could disable caching by
        # using ndb.get_context().set_cache_policy(False)
        ndb.get_context().clear_cache()

        self.tags = Tags()
        self.categories = Categories()
        self.posts = Posts()
        self.form = PostForm()
        self.uploadform = UploadForm()

    def test_tags_view(self):

        passed_days, remaining_days = calculate_work_date_stats()


        response = self.client.get((url_for('view_all_tags')))

        site_updated = self.posts.site_last_updated()

        flash(MSG)

        rendered_template = render_template('tags.html', user_status=users.is_current_user_admin(),siteupdated=site_updated,\
                           daysleft=remaining_days,dayspassed=passed_days,tags=self.tags.to_json(),
                           codeversion=CODEVERSION)

        self.assertEqualHTML(rendered_template, response.data.decode('utf-8'))

    def test_categories_view(self):

        passed_days, remaining_days = calculate_work_date_stats()

        response = self.client.get((url_for('view_all_categories')))

        site_updated = self.posts.site_last_updated()

        flash(MSG)

        rendered_template = render_template('categories.html', user_status=users.is_current_user_admin(),siteupdated=site_updated,\
                           daysleft=remaining_days,dayspassed=passed_days,tags=self.tags.to_json(),
                           codeversion=CODEVERSION)

        self.assertEqualHTML(rendered_template, response.data.decode('utf-8'))

    def test_archives_url_resolves_to_archive_page(self):

        passed_days, remaining_days = calculate_work_date_stats()
        
        flash(MSG)
        response = self.client.get((url_for('archives')))

        post_tag_names = self.tags.to_json()

        site_updated = self.posts.site_last_updated()
        posts_json = self.posts.to_json()

        rendered_template = render_template('archives.html', user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days, tags=self.tags,
                                            categories=self.categories,
                                            posts=posts_json,
                                            codeversion=CODEVERSION,
                                            form=self.form,
                                            uploadform=self.uploadform,
                                            posts_tags_names=post_tag_names)

        self.assertEqualHTML(rendered_template, response.data.decode('utf-8'))

    def test_archives_url_content_is_ok(self):

        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary")

        passed_days, remaining_days = calculate_work_date_stats()

        flash(MSG)

        response = self.client.get((url_for('archives')))

        post_tag_names = self.tags.to_json()

        site_updated = self.posts.site_last_updated()
        posts_json = self.posts.to_json()

        rendered_template = render_template('archives.html', user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days, tags=self.tags,
                                            categories=self.categories,
                                            posts=posts_json,
                                            codeversion=CODEVERSION,
                                            form=self.form,
                                            uploadform=self.uploadform,
                                            posts_tags_names=post_tag_names)

        self.assertEqualHTML(rendered_template, response.data.decode('utf-8'))

    def test_index_page_returns_correct_html(self):

        passed_days, remaining_days = calculate_work_date_stats()

        response = self.client.get('/')  # create a request object
        site_updated = self.posts.site_last_updated()
        flash(MSG)
        rendered_template = render_template("posts.html", user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days, tags=self.tags,
                                            categories=self.categories,
                                            posts=self.posts.to_json(),
                                            codeversion=CODEVERSION,
                                            form=self.form, uploadform=self.uploadform)
        self.assertEqualHTML(rendered_template, response.data.decode('utf-8'))

    def test_index_page_with_content_is_ok(self):

        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary")

        passed_days, remaining_days = calculate_work_date_stats()

        response = self.client.get((url_for('index')))  # create a request object

        site_updated = self.posts.site_last_updated()
        flash(MSG)
        rendered_template = render_template("posts.html", user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated,
                                            daysleft=remaining_days, dayspassed=passed_days, tags=self.tags,
                                            categories=self.categories,
                                            posts=self.posts.to_json(),
                                            codeversion=CODEVERSION, form=self.form, uploadform=self.uploadform)
        self.assertEqualHTML(rendered_template.decode('utf-8'), response.data.decode('utf-8'))

    def test_selected_post_page_returns_correct_html(self):

        passed_days, remaining_days = calculate_work_date_stats()

        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary")

        current_post = self.posts.get_by_title("a title")

        post_tag_names = current_post.get_tag_names()

        other_posts_tags = self.posts.get_other_tags(current_post.key.id())

        related_posts = []

        response = self.client.get(url_for('view_a_post', category="category", year=current_post.timestamp.year,
                                           month=current_post.timestamp.month, title="a title"))
        for post in self.posts:
            if post.key != current_post.key:
                for tag in post.tags:
                    if tag in other_posts_tags:
                        related_posts.append(post)

        category = post.category.get().category
        site_updated = self.posts.site_last_updated()
        flash(MSG)

        answers_form = AnswerRadioForm()

        answers_form.r_answers.choices = [("t", answer.p_answer) for answer in current_post.answers]

        rendered_template = render_template('singlepost.html', user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days, RelatedPosts=related_posts, \
                                            Post=current_post.to_json(), posttagnames=post_tag_names,
                                            category=category,  answers_field = answers_form)

        self.assertEqual(rendered_template.encode("utf-8"), response.data)

    def test_select_post_with_related_posts_returns_correct_html(self):
        passed_days, remaining_days = calculate_work_date_stats()

        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary")

        test_tags_related = ["a new tag", "a different tag"]
        new_rel_tag_keys = self.tags.add(test_tags_related)
        self.posts.add("a better title", "body without text",
                       category_key, new_rel_tag_keys, "this is new a summary")

        current_post = self.posts.get_by_title("a title")
        post_tag_names = current_post.get_tag_names()

        other_posts_tags = self.posts.get_other_tags(current_post.key.id())

        response = self.client.get(url_for('view_a_post', category="category", year=current_post.timestamp.year,
                                           month=current_post.timestamp.month, title="a title"))

        related_posts = self.posts.get_related_posts(current_post.id)


        category = current_post.category.get().category
        site_updated = self.posts.site_last_updated()
        flash(MSG)

        answers_form = AnswerRadioForm()

        answers_form.r_answers.choices = [("t", answer.p_answer) for answer in current_post.answers]

        rendered_template = render_template('singlepost.html', user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days, RelatedPosts=related_posts, \
                                            Post=current_post.to_json(), posttagnames=post_tag_names,
                                            category=category, answers_field=answers_form)

        self.assertEqual(rendered_template.encode("utf-8"), response.data)

    def test_tag_pag_returns_correct_html(self):

        passed_days, remaining_days = calculate_work_date_stats()

        response = self.client.get((url_for('index')))  # create a request object
        site_updated = self.posts.site_last_updated()
        flash(MSG)

        rendered_template = render_template("posts.html", user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days, tags=self.tags,
                                            categories=self.categories,
                                            posts=self.posts.to_json(),
                                            codeversion=CODEVERSION, form=self.form, uploadform=self.uploadform)
        self.assertEqualHTML(rendered_template, response.data.decode('utf-8'))

    def test_delete_post(self):

        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        post_key = self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary")

        response = self.client.delete(url_for('delete_post', id=post_key.id()))

        self.assertEqual("OK", response.json["msg"])

    def test_get_post(self):

        category_key = self.categories.add("category")

        existing_tags = ["a new tag", "a new new tag"]

        existing_tag_keys = self.tags.add(existing_tags)

        post_key = self.posts.add("a title", "body text", category_key, existing_tag_keys, "this is a summary")

        asked_post = post_key.get()

        post_tag_names = asked_post.get_tag_names()

        tag_names = self.tags.get_names()

        data = {u"title": asked_post.title, u"body": asked_post.body, u"category":
            asked_post.category.get().category,
                 u"category": category_key.get().category, u"id": str(asked_post.key.id()).decode('utf8'), \
                 u"tags": post_tag_names,
                 u"summary":asked_post.summary,
                 u"timestamp": asked_post.timestamp.strftime(DATEFORMAT).decode('utf8')
                    , u"updated":
                     asked_post.updated.strftime(DATEFORMAT).decode('utf8'),
                u"answers":[]
                 }

        response = self.client.get(url_for("get_post", id=post_key.id()))

        self.assertDictEqual(data, response.json)

    def test_add_post(self):

        existing_tags = [u"a new new tag", u"a new tag"]
        freezer = freeze_time(u"2017-03-20")
        freezer.start()
        json_data = {u'category': u'category', u'tags': existing_tags, u"summary": u"this is a summary",
                     u'title': u'a title',u'body': u'body text', u'timestamp': datetimeformat(datetime.now()).decode("utf-8"),
                     u'updated': datetimeformat(datetime.now()).decode("utf-8"), "answers" :
                         [{u'p_answer':'a potential answer', u'is_correct':True,
                           u'statistics': 0.0,    u'nof_times_selected': 0}]}

        response = self.client.post(url_for('main'), content_type='application/json',
                                   data=json.dumps(json_data))
        json_data[u"id"] = u'4'

        self.assertDictEqual(json_data, response.json)
        freezer.stop()

    def test_api_posts(self):
        existing_tags = [u"a new new tag", u"a new tag"]
        freezer = freeze_time(u"2017-03-20 17:48:18")
        freezer.start()
        json_data = {u'category': u'category', u'tags': existing_tags, u"summary": u"this is a summary",
                     u'title': u'a title', u'body': u'body text', u'timestamp': datetimeformat(datetime.now())
                .decode("utf-8"),
                     u'updated': datetimeformat(datetime.now()).decode("utf-8"),
                     "answers":
                         [{u'p_answer': 'a potential answer', u'is_correct': True,
                           u'statistics': 0.0, u'nof_times_selected': 0}]}

        response = self.client.post(url_for('main'), content_type='application/json',
                         data=json.dumps(json_data))

        json_data[u"id"] = u'4'

        self.assertDictEqual(json_data, response.json)
        freezer.stop()

    def test_api_posts_with_files(self):
        existing_tags = [u"a new new tag", u"a new tag"]
        freezer = freeze_time(u"2017-03-20 17:48:18")
        freezer.start()
        json_data = {u'category': u'category', u'tags': existing_tags, u"summary": u"this is a summary",
                     u'title': u'a title', u'body': u'body text', u'timestamp': datetimeformat(datetime.now())
                .decode("utf-8"),
                     u'updated': datetimeformat(datetime.now()).decode("utf-8"),
                     "answers":
                         [{u'p_answer': 'a potential answer', u'is_correct': True,
                           u'statistics': 0.0, u'nof_times_selected': 0}]}


        response = self.client.post(url_for('main'), content_type='application/json',
                         data=json.dumps(json_data))

        json_data[u"id"] = u'4'

        self.assertDictEqual(json_data, response.json)
        freezer.stop()

    def test_no_post(self):

        response = self.client.get(url_for('main'))

        self.assertFalse(response.json)

    def test_edit_post(self):

        category_key = self.categories.add("category")

        existing_tags = ["a new tag", "a new new tag"]
        editing_tags = ["a new tag", "tag to added"]  # final tags are "a new tag", "tag to added"

        existing_tag_keys = self.tags.add(existing_tags)

        post_key = self.posts.add("a title", "body text", category_key, existing_tag_keys, "this is a summary")

        self.posts.add("a title 2", "body text 2", category_key, existing_tag_keys, "this is a summary 2")

        updating_post = post_key.get()

        json_data = {'category': 'a new category', 'tags': editing_tags, 'title': 'a new title', 'body': 'body text',
                     'summary': 'this is a new summary',
                     'answers':[]}

        response = self.client.put(url_for('edit_post', id=post_key.id()), content_type='application/json',
                                   data=json.dumps(json_data))

        tag_names = [u"a new tag", u"a new new tag", u"tag to added"]
        post_tag_names = [u"a new tag", u"tag to added"]

        data = {u"title": 'a new title', u"body": updating_post.body, u"category":
                 "a new category", u"id": str(updating_post.key.id()).decode('utf8'), \
                 u"tags": post_tag_names,
                'summary': 'this is a new summary',
                 u"timestamp": updating_post.timestamp.strftime(DATEFORMAT).decode('utf8')
                    , u"updated":
                     updating_post.updated.strftime(DATEFORMAT).decode('utf8'),
                 u"answers":updating_post.answers
                 }

        self.assertDictEqual(data, response.json)

    def test_edit_a_post_view(self):

        category_key = self.categories.add("category")

        existing_tags = ["a new tag", "a new new tag"]

        existing_tag_keys = self.tags.add(existing_tags)

        post_key = self.posts.add("a title", "body text", category_key, existing_tag_keys, "this is a summary")

        response = self.client.get(url_for('edit_a_post_view', postkey=post_key))

        flash(MSG)

        site_updated = self.posts.site_last_updated()
        passed_days, remaining_days = calculate_work_date_stats()

        rendered_template = render_template('posts.html', user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days,
                                            codeversion=CODEVERSION, form=self.form, uploadform=self.uploadform)

        self.assertEqualHTML(rendered_template.decode('utf8'), response.data.decode('utf8'))

    def test_about_page(self):

        category_key = self.categories.add("category")

        existing_tags = ["a new tag", "a new new tag"]

        existing_tag_keys = self.tags.add(existing_tags)

        self.posts.add("about", "body text", category_key, existing_tag_keys, "this is a summary")

        requested_post = self.posts.get_by_title('about')

        response = self.client.get(url_for('aboutpage'))

        passed_days, remaining_days = calculate_work_date_stats()

        site_updated = self.posts.site_last_updated()

        flash(MSG)
        rendered_template = render_template('about.html',user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated,\
                           daysleft=remaining_days,dayspassed=passed_days,Post=requested_post,
                           codeversion=CODEVERSION)

        self.assertEqualHTML(rendered_template.decode('utf8'), response.data.decode('utf8'))

    def test_searchresults(self):

        category_key = self.categories.add("category")

        existing_tags = ["a new tag", "a new new tag"]

        existing_tag_keys = self.tags.add(existing_tags)

        self.posts.add("about", "body text", category_key, existing_tag_keys, "this is a summary")

        passed_days, remaining_days = calculate_work_date_stats()

        site_updated = self.posts.site_last_updated()

        flash(MSG)

        rendered_template = render_template("posts.html",  user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days,
                                            posts=self.posts.to_json(),
                                            codeversion=CODEVERSION, form=self.form, uploadform=self.uploadform)

        response = self.client.get(url_for('searchresults', q="body"))

        self.assertEqualHTML( response.data.decode('utf8'),rendered_template.decode('utf8'))

    def test_search_query(self):

        category_key = self.categories.add("category")
        existing_tags = ["a new tag", "a new new tag"]
        existing_tag_keys = self.tags.add(existing_tags)

        self.posts.add("about", "body text", category_key, existing_tag_keys, "this is a summary")

        query_string = "body"
        results = query_search_index(query_string)
        posts_ids = find_posts_from_index(results)
        self.posts.filter_matched(posts_ids)

        response = self.client.get(url_for('searchsite', query="body"))

        return self.assertDictEqual({u'data':self.posts.to_json()}, response.json)

    def test_view_filtered_posts_by_tag(self):

        category_key = self.categories.add("category")
        existing_tags = ["a new tag", "a new new tag"]
        existing_tag_keys = self.tags.add(existing_tags)

        self.posts.add("about", "body text", category_key, existing_tag_keys)

        second_tags = ["a new second tag", "a new new second tag"]
        second_tag_keys = self.tags.add(second_tags)

        self.posts.add("about second post", "body secod text", category_key, second_tag_keys)

        self.posts.filter_by_tag('a new tag')

        flash(MSG)
        passed_days, remaining_days = calculate_work_date_stats()
        site_updated = self.posts.site_last_updated()
        rendered_template = render_template("posts.html",  user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days,
                                            tags=self.tags, categories=self.categories,
                                            posts=self.posts.to_json(),
                                            codeversion=CODEVERSION, form=self.form, uploadform=self.uploadform)

        response = self.client.get(path='/tags/a new tag')

        return self.assertEqualHTML(rendered_template.decode('utf8'), response.data.decode('utf8'))

    def test_view_filtered_posts_by_category(self):

         category_key = self.categories.add("a category")
         existing_tags = ["a new tag", "a new new tag"]
         existing_tag_keys = self.tags.add(existing_tags)

         self.posts.add("about", "body text", category_key, existing_tag_keys)

         second_tags = ["a new second tag", "a new new second tag"]
         second_tag_keys = self.tags.add(second_tags)

         self.posts.add("about second post", "body secod text", category_key, second_tag_keys)

         self.posts.filter_by_category('a category')

         passed_days, remaining_days = calculate_work_date_stats()
         site_updated = self.posts.site_last_updated()

         flash(MSG)

         rendered_template = render_template("posts.html", user_status=users.is_current_user_admin(),
                                             siteupdated=site_updated, \
                                             daysleft=remaining_days, dayspassed=passed_days,
                                             tags=self.tags, categories=self.categories,
                                             posts=self.posts.to_json(),
                                             codeversion=CODEVERSION, form=self.form, uploadform=self.uploadform)

         response = self.client.get(path='/categories/a category')

         return self.assertEqualHTML(rendered_template.decode('utf8'), response.data.decode('utf8'))

    def test_404_not_found_page(self):
        response = self.client.get(path='/a path not existing')
        flash(MSG)
        rendered_template = render_template('404.html')

        return self.assertEqualHTML(rendered_template.decode('utf8'), response.data.decode('utf8'))

    def test_user(self):
        response = self.client.get(path='/user')
        return self.assertDictEqual({'user_status':users.is_current_user_admin()},response.json)

    def test_redirect_on_search(self):
        response = self.client.get((url_for('index', q="test redirect on search")))  # cre

        return self.assertStatus(response, 302)

    def test_feed(self):
        category_key = self.categories.add("category")
        existing_tags = ["a new tag", "a new new tag"]
        existing_tag_keys = self.tags.add(existing_tags)

        self.posts.add("about", "body text", category_key, existing_tag_keys)

        response = self.client.get(path='/recent.atom')

        feed = AtomFeed('Recent Articles',
                        feed_url='http://localhost/recent.atom', url=request.url_root)

        feed = self.posts.add_to_feed(feed, request.url)

        return self.assertEqual(feed.to_string(), response.data.decode('utf8'))

    def test_rebuild_index(self):
        category_key = self.categories.add("category")
        existing_tags = ["a new tag", "a new new tag"]
        existing_tag_keys = self.tags.add(existing_tags)

        self.posts.add("about", "body text", category_key, existing_tag_keys)

        response = self.client.get(path='/rebuild_index')

        return self.assertStatus(response, 302)

    def test_api_answers_post_method(self):
        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary",
                       [{"p_answer":"ans1", "is_correct":True},{"p_answer":"ans2","is_correct":False}])


        json_data_f = {"p_answer":"ans2","is_correct":"True"}



        response = self.client.post(url_for('answers', title="a title"), content_type='application/json',
                                    data=json.dumps(json_data_f))#, headers={"csrf_token":csrf_token})

        self.assertDictEqual({u'msg': u'Sorry, no attempts left!', u'result': False,
                              u'remaining_attempts': 0,u'alert_type':u'warning',
                              u'answers_stats':{}}, response.json)

        json_data_f = {"p_answer": "ans2", "is_correct": "True"}
        response = self.client.post(url_for('answers', title="a title"), content_type='application/json',
                                    data=json.dumps(json_data_f))

        self.assertDictEqual({u'msg': u'Sorry, no attempts left!',u'alert_type':u'warning', u'result': False,
                              u'remaining_attempts':-1,
                              u'answers_stats': {}
                              }, response.json)

    def test_api_answers_post_method_correct_guess(self):
        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary",
                       [{"p_answer": "ans1", "is_correct": True}, {"p_answer": "ans2", "is_correct": False}])

        json_data_f = {"p_answer": "ans1", "is_correct": "True"}

        response = self.client.post(url_for('answers', title="a title"), content_type='application/json',
                                    data=json.dumps(json_data_f))  # , headers={"csrf_token":csrf_token})

        self.assertDictEqual({u'msg': u'Great!', u'result': True,
                              u'remaining_attempts': 0, u'alert_type': u'success',
                              u'answers_stats': {u'Answer': u'Selection', u'ans1': 1, u'ans2': 0}}, response.json)

    def test_is_cookie_set(self):
        with app.test_client() as c:
            c.post(url_for('ga_accept'), follow_redirects=True)

            c_value = request.cookies.get('ga_accepted')

            self.assertEqual(c_value,  'True')

    def test_is_cookie_set_false(self):
        with app.test_client() as c:
            c.post(url_for('ga_decline'), follow_redirects=True)

            c_value = request.cookies.get('ga_accepted')

            self.assertEqual(c_value, 'False')

    def test_accept_google_analytics(self):
        with app.test_client() as c:
            c.post(url_for('ga_accept'), follow_redirects=True)
            accept_google_analytics()
            self.assertTrue(app.jinja_env.globals['ga_accepted'])

        with app.test_client() as c:
            c.post(url_for('ga_decline'), follow_redirects=True)
            accept_google_analytics()
            self.assertFalse(app.jinja_env.globals['ga_accepted'])

    def test_questions_view(self):
        category_key = self.categories.add("reconstructing a test")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary",
                       [{"p_answer": "ans1", "is_correct": True}, {"p_answer": "ans2", "is_correct": False}])

        category_key = self.categories.add("reconstructing a test")
        test_tags = ["a tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title here", "body to test the question text",
                       category_key, new_tag_keys, "this is a summary",
                       [{"p_answer": "a test answ correct", "is_correct": True},
                        {"p_answer": "a wrong tet answer", "is_correct": False}])

        response = self.client.get(path="/questions/reconstructing a test")

        self.posts.filter_by_category("reconstructing a test")

        flash(MSG)
        passed_days, remaining_days = calculate_work_date_stats()
        site_updated = self.posts.site_last_updated()
        self.posts.to_answers_form()

        rendered_template = render_template("questions.html", user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days,
                                            tags=self.tags, categories=self.categories,
                                            posts=self.posts,
                                            codeversion=CODEVERSION)


        return self.assertEqualHTML(rendered_template.decode('utf8'), response.data.decode('utf8'))


    def test_redirect_nonwww(self):
        app.config['SERVER_NAME'] = "arsakian.com"
        with app.test_request_context():

            with app.test_client() as c:
                response = c.get(url_for('index', _external=True))
                self.assertEqual(response.location, "http://www.arsakian.com/")

                response = c.get(url_for('archives', _external=True))
                self.assertEqual(response.location, "http://www.arsakian.com/archives")
        app.config['SERVER_NAME'] = None

    # def test_upload(self):
    #     output = StringIO()
    #     output.write('hello there')
    #
    #     response = self.client.post(url_for('upload'), buffered=True,
    #                        content_type='multipart/form-data',
    #                                 data={'file_field': (output, 'hello there')})
    #
    #
    #     self.assertEqual('ok',response.data)
Beispiel #14
0
class TestViews(BlogTestBase):
    maxDiff = None

    def setUp(self):
        self.testbed = testbed.Testbed()
        # Then activate the testbed, which prepares the service stubs for use.
        self.testbed.activate()
        # Next, declare which service stubs you want to use.
        self.testbed.init_datastore_v3_stub()
        # enable memcache
        self.testbed.init_memcache_stub()

        self.testbed.init_user_stub(enable=True)

        self.testbed.init_search_stub(enable=True)

        self.testbed.init_urlfetch_stub()

        self.testbed.init_app_identity_stub()
        self.testbed.init_blobstore_stub()

        self.testbed.setup_env(
            USER_EMAIL='*****@*****.**',
            USER_ID='123',
            USER_IS_ADMIN='1',
            overwrite=True)

        # Clear ndb's in-context cache between tests.
        # This prevents data from leaking between tests.
        # Alternatively, you could disable caching by
        # using ndb.get_context().set_cache_policy(False)
        ndb.get_context().clear_cache()

        self.tags = Tags()
        self.categories = Categories()
        self.posts = Posts()
        self.form = PostForm()

    def test_tags_view(self):

        passed_days, remaining_days = calculate_work_date_stats()


        response = self.client.get((url_for('view_all_tags')))

        site_updated = self.posts.site_last_updated()

        flash(MSG)

        rendered_template = render_template('tags.html', user_status=users.is_current_user_admin(),siteupdated=site_updated,\
                           daysleft=remaining_days,dayspassed=passed_days,tags=self.tags.to_json(),
                           codeversion=CODEVERSION)

        self.assertEqualHTML(rendered_template, response.data.decode('utf-8'))

    def test_categories_view(self):

        passed_days, remaining_days = calculate_work_date_stats()

        response = self.client.get((url_for('view_all_categories')))

        site_updated = self.posts.site_last_updated()

        flash(MSG)

        rendered_template = render_template('categories.html', user_status=users.is_current_user_admin(),siteupdated=site_updated,\
                           daysleft=remaining_days,dayspassed=passed_days,tags=self.tags.to_json(),
                           codeversion=CODEVERSION)

        self.assertEqualHTML(rendered_template, response.data.decode('utf-8'))

    def test_archives_url_resolves_to_archive_page(self):

        passed_days, remaining_days = calculate_work_date_stats()
        
        flash(MSG)
        response = self.client.get((url_for('archives')))

        post_tag_names = self.tags.to_json()

        site_updated = self.posts.site_last_updated()
        posts_json = self.posts.to_json()

        rendered_template = render_template('archives.html', user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days, tags=self.tags,
                                            categories=self.categories,
                                            posts=posts_json,
                                            codeversion=CODEVERSION,
                                            form=self.form,
                                            posts_tags_names=post_tag_names)

        self.assertEqualHTML(rendered_template, response.data.decode('utf-8'))

    def test_archives_url_content_is_ok(self):

        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary")

        passed_days, remaining_days = calculate_work_date_stats()

        flash(MSG)

        response = self.client.get((url_for('archives')))

        post_tag_names = self.tags.to_json()

        site_updated = self.posts.site_last_updated()
        posts_json = self.posts.to_json()

        rendered_template = render_template('archives.html', user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days, tags=self.tags,
                                            categories=self.categories,
                                            posts=posts_json,
                                            codeversion=CODEVERSION,
                                            form=self.form,
                                            posts_tags_names=post_tag_names)

        self.assertEqualHTML(rendered_template, response.data.decode('utf-8'))

    def test_index_page_returns_correct_html(self):

        passed_days, remaining_days = calculate_work_date_stats()

        response = self.client.get('/')  # create a request object
        site_updated = self.posts.site_last_updated()
        flash(MSG)
        rendered_template = render_template("posts.html", user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days, tags=self.tags,
                                            categories=self.categories,
                                            posts=self.posts.to_json(),
                                            codeversion=CODEVERSION,
                                            form=self.form)
        self.assertEqualHTML(rendered_template, response.data.decode('utf-8'))

    def test_index_page_with_content_is_ok(self):

        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary")

        passed_days, remaining_days = calculate_work_date_stats()

        response = self.client.get((url_for('index')))  # create a request object

        site_updated = self.posts.site_last_updated()
        flash(MSG)
        rendered_template = render_template("posts.html", user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated,
                                            daysleft=remaining_days, dayspassed=passed_days, tags=self.tags,
                                            categories=self.categories,
                                            posts=self.posts.to_json(),
                                            codeversion=CODEVERSION, form=self.form)
        self.assertEqualHTML(rendered_template.decode('utf-8'), response.data.decode('utf-8'))

    def test_selected_post_page_returns_correct_html(self):

        passed_days, remaining_days = calculate_work_date_stats()

        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary")

        current_post = self.posts.get_by_title("a title")

        post_tag_names = current_post.get_tag_names()

        other_posts_tags = self.posts.get_other_tags(current_post.key.id())

        related_posts = []

        with open(os.path.join(TEST_IMAGE)) as f:
            self.assertTrue(current_post.add_blob(f.read(), TEST_IMAGE, 'image/jpeg'))

        response = self.client.get(url_for('view_a_post', category="category", year=current_post.timestamp.year,
                                           month=current_post.timestamp.month, title="a title"))
        for post in self.posts:
            if post.key != current_post.key:
                for tag in post.tags:
                    if tag in other_posts_tags:
                        related_posts.append(post)

        category = post.category.get().category
        site_updated = self.posts.site_last_updated()
        flash(MSG)

        answers_form = AnswerRadioForm()

        answers_form.r_answers.choices = [("t", answer.p_answer) for answer in current_post.answers]

        rendered_template = render_template('singlepost.html', user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days, RelatedPosts=related_posts, \
                                            Post=current_post.to_json(), posttagnames=post_tag_names,
                                            category=category,  answers_field=answers_form)

        self.assertEqual(rendered_template.encode("utf-8"), response.data)

    def test_select_post_with_related_posts_returns_correct_html(self):
        passed_days, remaining_days = calculate_work_date_stats()

        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary")

        test_tags_related = ["a new tag", "a different tag"]
        new_rel_tag_keys = self.tags.add(test_tags_related)
        self.posts.add("a better title", "body without text",
                       category_key, new_rel_tag_keys, "this is new a summary")

        current_post = self.posts.get_by_title("a title")
        post_tag_names = current_post.get_tag_names()

        other_posts_tags = self.posts.get_other_tags(current_post.key.id())

        response = self.client.get(url_for('view_a_post', category="category", year=current_post.timestamp.year,
                                           month=current_post.timestamp.month, title="a title"))

        related_posts = self.posts.get_related_posts(current_post.id)


        category = current_post.category.get().category
        site_updated = self.posts.site_last_updated()
        flash(MSG)

        answers_form = AnswerRadioForm()

        answers_form.r_answers.choices = [("t", answer.p_answer) for answer in current_post.answers]

        rendered_template = render_template('singlepost.html', user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days, RelatedPosts=related_posts, \
                                            Post=current_post.to_json(), posttagnames=post_tag_names,
                                            category=category, answers_field=answers_form)

        self.assertEqual(rendered_template.encode("utf-8"), response.data)

    def test_tag_pag_returns_correct_html(self):

        passed_days, remaining_days = calculate_work_date_stats()

        response = self.client.get((url_for('index')))  # create a request object
        site_updated = self.posts.site_last_updated()
        flash(MSG)

        rendered_template = render_template("posts.html", user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days, tags=self.tags,
                                            categories=self.categories,
                                            posts=self.posts.to_json(),
                                            codeversion=CODEVERSION, form=self.form)
        self.assertEqualHTML(rendered_template, response.data.decode('utf-8'))

    def test_delete_post(self):

        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        post_key = self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary")

        response = self.client.delete(url_for('delete_post', id=post_key.id()))

        self.assertEqual("OK", response.json["msg"])

        self.assertItemsEqual([], self.posts)


    def test_delete_post_with_image(self):
        with open(os.path.join(TEST_IMAGE)) as f:
            img_stringIO = StringIO.StringIO(f.read())  # in memory read

        post, _, _ = self.create_post()
        post.add_blob(img_stringIO.read(), TEST_IMAGE, 'image/jpeg')
        response = self.client.delete(url_for('delete_post', id=post.key.id()))

        self.assertEqual("OK", response.json["msg"])
        self.assertEqual(0, len(self.posts))

    def test_get_post(self):

        category_key = self.categories.add("category")

        existing_tags = ["a new tag", "a new new tag"]

        existing_tag_keys = self.tags.add(existing_tags)

        post_key = self.posts.add("a title", "body text", category_key, existing_tag_keys, "this is a summary")

        asked_post = post_key.get()

        post_tag_names = asked_post.get_tag_names()

        tag_names = self.tags.get_names()

        data = {u"title": asked_post.title, u"body": asked_post.body, u"category":
            asked_post.category.get().category,
                 u"category": category_key.get().category, u"id": str(asked_post.key.id()).decode('utf8'), \
                 u"tags": [{u"key": str(existing_tag_keys[0]).decode('utf8'),
                            u"val":existing_tag_keys[0].get().tag},
                         {u"key": str(existing_tag_keys[1]).decode('utf8'),
                          u"val":existing_tag_keys[1].get().tag}],
                 u"summary":asked_post.summary,
                 u"timestamp": asked_post.timestamp.strftime(DATEFORMAT).decode('utf8')
                    , u"updated":
                     asked_post.updated.strftime(DATEFORMAT).decode('utf8'),
                u"answers":[], u'images': []
                 }

        response = self.client.get(url_for("get_post", id=post_key.id()))

        self.assertDictEqual(data, response.json)

    def test_add_post(self):

        existing_tags = [u"a new new tag", u"a new tag"]
        freezer = _freeze_time(u"2017-03-20")
        freezer.start()
        json_data = {u'category': u'category', u'tags': existing_tags, u"summary": u"this is a summary",
                     u'title': u'a title',u'body': u'body text', u'timestamp': datetimeformat(datetime.now()).decode("utf-8"),
                     u'updated': datetimeformat(datetime.now()).decode("utf-8"), u"answers" :
                         [{u'p_answer':u'a potential answer', u'is_correct':True,
                           u'statistics': 0.0,    u'nof_times_selected': 0}]}

        response = self.client.post(url_for('main'), content_type='application/json',
                                   data=json.dumps(json_data))
        json_data[u"id"] = u'4'
        json_data[u'images'] = []
        json_data[u'tags'] = [{u"key": str(tag_key).decode("utf-8"), u"val": tag_key.get().tag} for tag_key in
                              self.posts[0].tags]
        self.assertDictEqual(json_data, response.json)
        freezer.stop()

    def test_api_posts(self):
        existing_tags = [u"a new new tag", u"a new tag"]
        freezer = _freeze_time(u"2017-03-20 17:48:18")
        freezer.start()
        json_data = {u'category': u'category', u'tags': existing_tags, u"summary": u"this is a summary",
                     u'title': u'a title', u'body': u'body text', u'timestamp': datetimeformat(datetime.now())
                .decode("utf-8"),
                     u'updated': datetimeformat(datetime.now()).decode("utf-8"),
                     u"answers":
                         [{u'p_answer': u'a potential answer', u'is_correct': True,
                           u'statistics': 0.0, u'nof_times_selected': 0}]}

        response = self.client.post(url_for('main'), content_type='application/json',
                         data=json.dumps(json_data))

        json_data[u"id"] = u'4'
        json_data[u'images'] = []
        json_data[u'tags'] = [{u"key": str(tag_key).decode("utf-8"), u"val": tag_key.get().tag} for tag_key in self.posts[0].tags]
        self.assertDictEqual(json_data, response.json)
        freezer.stop()

    def test_api_posts_with_image(self):
        post, _, _ = self.create_post()
        import io
        with open(os.path.join(TEST_IMAGE), 'rb') as f:
            data = dict(
                image=[(io.BytesIO(f.read()), TEST_IMAGE)],
            )

            response = self.client.post(path='/api/posts/{}/images'.format(post.id), data=data,
                                   content_type='multipart/form-data',
                                   follow_redirects=True)

            self.assertDictEqual({'image_key':
                                      u'encoded_gs_file:YXBwX2RlZmF1bHRfYnVja2V0LzIwMTlfMV80XzE2ei5naWY='},
                                 response.json)

        with open(os.path.join(TEST_IMAGE), 'rb') as f:
            data = dict(
                wrong_key=[(io.BytesIO(f.read()), TEST_IMAGE)],
            )

            response = self.client.post(path='/api/posts/{}/images'.format(post.id), data=data,
                                   content_type='multipart/form-data',
                                   follow_redirects=True)
            return self.assertStatus(response, 500)

    def test_api_posts_with_files(self):
        existing_tags = [u"a new new tag", u"a new tag"]
        with freeze_time(u"2019-11-05"):

            with open(TEST_IMAGE, 'rb') as f:
                byte_content = f.read()

            with open(TEST_IMAGE2, 'rb') as f:
                byte_content_2 = f.read()

            images = [{'filename': "C:\\fakepath\\{}".format(TEST_IMAGE),
                      'url': "data:image/jpeg;base64,{}".format(b64encode(byte_content))},
                      {'filename': "C:\\fakepath\\{}".format(TEST_IMAGE2),
                      'url': "data:image/jpeg;base64,{}".format(b64encode(byte_content_2))}]

            json_data = {u'category': u'category', u'tags': existing_tags, u"summary": u"this is a summary",
                         u'title': u'a title', u'body': u'body text', u'timestamp': datetimeformat(datetime.now())
                    .decode("utf-8"),
                         u'updated': datetimeformat(datetime.now()).decode("utf-8"),
                         u"answers":[], u'images':images}

            response = self.client.post(url_for('main'), content_type='application/json',
                             data=json.dumps(json_data))

            tags = [{ u"key": str(tag_key).decode("utf-8"), u"val": tag_key.get().tag} for tag_key in self.posts[0].tags]
            json_data = {u"id":"4",u'category': u'category', u'tags': tags, u"summary": u"this is a summary",
                         u'title': u'a title', u'body': u'body text', u'timestamp': datetimeformat(datetime.now())
                    .decode("utf-8"),
                         u'updated': datetimeformat(datetime.now()).decode("utf-8"),
                         u"answers": [], u'images':
                             [{u'blob_key': u'encoded_gs_file:YXBwX2RlZmF1bHRfYnVja2V0LzIwMTlfMV80XzE2ei5naWY=',
                                      u'filename': TEST_IMAGE}, {u'blob_key': u'encoded_gs_file:YXBwX2RlZmF1bHRfYnVja2V0LzEyXzNfNF8zXzEyei5wbmc=',
                                                     u'filename': TEST_IMAGE2}]}
            self.assertDictEqual(json_data, response.json)

    def test_no_post(self):

        response = self.client.get(url_for('main'))

        self.assertFalse(response.json)

    def test_edit_post_add_answers(self):
        post, _, tag_keys = self.create_post()

        editing_tags = ["a new tag", "tag to added"]
        json_data = {u'category': u'a new category', 'tags': editing_tags, 'title': 'a new title', 'body': 'body text',
                     u'summary': u'this is a new summary',
                     'answers': [{u"p_answer": u"ans1", "is_correct": True}, {u"p_answer": u"ans2", "is_correct": False}]}

        response = self.client.put(url_for('edit_post', id=post.key.id()), content_type='application/json',
                                   data=json.dumps(json_data))
        tags = [{"key": str(tag_key), "val": tag_key.get().tag} for tag_key in post.tags]
        data = {u"title": u'a new title', u"body": post.body, u"category":
            u"a new category", u"id": str(post.key.id()).decode('utf8'), \
                u"tags": tags,
                u'summary': u'this is a new summary',
                u"timestamp": post.timestamp.strftime(DATEFORMAT).decode('utf8')
            , u"updated": post.updated.strftime(DATEFORMAT).decode('utf8'),
                u"answers": [{u"p_answer": u"ans1", u"is_correct": True,
                              u'statistics': 0.0, u'nof_times_selected': 0},
                             {u"p_answer": u"ans2", u"is_correct": False,
                              u'statistics': 0.0, u'nof_times_selected': 0}], u'images': []}

        self.assertDictEqual(data, response.json)

    def test_edit_post(self):

        category_key = self.categories.add("category")

        existing_tags = ["a new tag", "a new new tag"]
        editing_tags = ["a new tag", "tag to added"]  # final tags are "a new tag", "tag to added"

        existing_tag_keys = self.tags.add(existing_tags)

        post_key = self.posts.add("a title", "body text", category_key, existing_tag_keys, "this is a summary")

        self.posts.add("a title 2", "body text 2", category_key, existing_tag_keys, "this is a summary 2")

        updating_post = post_key.get()

        json_data = {u'category': u'a new category', 'tags': editing_tags, 'title': 'a new title', 'body': 'body text',
                     u'summary': u'this is a new summary',
                     'answers':[]}

        response = self.client.put(url_for('edit_post', id=post_key.id()), content_type='application/json',
                                   data=json.dumps(json_data))

        tags = [{"key": str(tag_key), "val": tag_key.get().tag} for tag_key in post_key.get().tags]
        data = {u"title": u'a new title', u"body": updating_post.body, u"category":
                 u"a new category", u"id": str(updating_post.key.id()).decode('utf8'), \
                 u"tags": tags,
                u'summary': u'this is a new summary',
                 u"timestamp": updating_post.timestamp.strftime(DATEFORMAT).decode('utf8')
                    , u"updated":
                     updating_post.updated.strftime(DATEFORMAT).decode('utf8'),
                 u"answers":updating_post.answers,u'images':[],
                 }

        self.assertDictEqual(data, response.json)

    def test_edit_a_post_view(self):

        category_key = self.categories.add("category")

        existing_tags = ["a new tag", "a new new tag"]

        existing_tag_keys = self.tags.add(existing_tags)

        post_key = self.posts.add("a title", "body text", category_key, existing_tag_keys, "this is a summary")

        response = self.client.get(url_for('edit_a_post_view', postkey=post_key))

        flash(MSG)

        site_updated = self.posts.site_last_updated()
        passed_days, remaining_days = calculate_work_date_stats()

        rendered_template = render_template('posts.html', user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days,
                                            codeversion=CODEVERSION, form=self.form)

        self.assertEqualHTML(rendered_template.decode('utf8'), response.data.decode('utf8'))

    def test_about_page(self):

        category_key = self.categories.add("category")

        existing_tags = ["a new tag", "a new new tag"]

        existing_tag_keys = self.tags.add(existing_tags)

        self.posts.add("about", "body text", category_key, existing_tag_keys, "this is a summary")

        requested_post = self.posts.get_by_title('about')

        response = self.client.get(url_for('aboutpage'))

        passed_days, remaining_days = calculate_work_date_stats()

        site_updated = self.posts.site_last_updated()

        flash(MSG)
        rendered_template = render_template('about.html',user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated,\
                           daysleft=remaining_days,dayspassed=passed_days,Post=requested_post,
                           codeversion=CODEVERSION)

        self.assertEqualHTML(rendered_template.decode('utf8'), response.data.decode('utf8'))

    def test_searchresults(self):

        category_key = self.categories.add("category")

        existing_tags = ["a new tag", "a new new tag"]

        existing_tag_keys = self.tags.add(existing_tags)

        self.posts.add("about", "body text", category_key, existing_tag_keys, "this is a summary")

        passed_days, remaining_days = calculate_work_date_stats()

        site_updated = self.posts.site_last_updated()

        flash(MSG)

        rendered_template = render_template("posts.html",  user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days,
                                            posts=self.posts.to_json(),
                                            codeversion=CODEVERSION, form=self.form)

        response = self.client.get(url_for('searchresults', q="body"))

        self.assertEqualHTML( response.data.decode('utf8'),rendered_template.decode('utf8'))

    def test_search_query(self):

        category_key = self.categories.add("category")
        existing_tags = ["a new tag", "a new new tag"]
        existing_tag_keys = self.tags.add(existing_tags)

        self.posts.add("about", "body text", category_key, existing_tag_keys, "this is a summary")

        query_string = "body"
        results = query_search_index(query_string)
        posts_ids = find_posts_from_index(results)
        self.posts.filter_matched(posts_ids)

        response = self.client.get(url_for('searchsite', query="body"))

        return self.assertDictEqual({u'data':self.posts.to_json()}, response.json)

    def test_view_filtered_posts_by_tag(self):

        category_key = self.categories.add("category")
        existing_tags = ["a new tag", "a new new tag"]
        existing_tag_keys = self.tags.add(existing_tags)

        self.posts.add("about", "body text", category_key, existing_tag_keys)

        second_tags = ["a new second tag", "a new new second tag"]
        second_tag_keys = self.tags.add(second_tags)

        self.posts.add("about second post", "body secod text", category_key, second_tag_keys)

        self.posts.filter_by_tag('a new tag')

        flash(MSG)
        passed_days, remaining_days = calculate_work_date_stats()
        site_updated = self.posts.site_last_updated()
        rendered_template = render_template("posts.html",  user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days,
                                            tags=self.tags, categories=self.categories,
                                            posts=self.posts.to_json(),
                                            codeversion=CODEVERSION, form=self.form)

        response = self.client.get(path='/tags/a new tag')

        return self.assertEqualHTML(rendered_template.decode('utf8'), response.data.decode('utf8'))

    def test_view_filtered_posts_by_category(self):

         category_key = self.categories.add("a category")
         existing_tags = ["a new tag", "a new new tag"]
         existing_tag_keys = self.tags.add(existing_tags)

         self.posts.add("about", "body text", category_key, existing_tag_keys)

         second_tags = ["a new second tag", "a new new second tag"]
         second_tag_keys = self.tags.add(second_tags)

         self.posts.add("about second post", "body secod text", category_key, second_tag_keys)

         self.posts.filter_by_category('a category')

         passed_days, remaining_days = calculate_work_date_stats()
         site_updated = self.posts.site_last_updated()

         flash(MSG)

         rendered_template = render_template("posts.html", user_status=users.is_current_user_admin(),
                                             siteupdated=site_updated, \
                                             daysleft=remaining_days, dayspassed=passed_days,
                                             tags=self.tags, categories=self.categories,
                                             posts=self.posts.to_json(),
                                             codeversion=CODEVERSION, form=self.form)

         response = self.client.get(path='/categories/a category')

         return self.assertEqualHTML(rendered_template.decode('utf8'), response.data.decode('utf8'))

    def test_404_not_found_page(self):
        response = self.client.get(path='/a path not existing')
        flash(MSG)
        rendered_template = render_template('404.html')

        return self.assertEqualHTML(rendered_template.decode('utf8'), response.data.decode('utf8'))

    def test_500_error_page(self):
        json_data = {u'category': u'a new category', 'tags': '', 'title': 'a new title', 'body': 'body text',
                     u'summary': u'this is a new summary',
                     'answers': []}

        response = self.client.put(url_for('edit_post', id='34'), content_type='application/json',
                                   data=json.dumps(json_data))
        accept_google_analytics()
        rendered_template = render_template('500.html')

        return self.assertEqualHTML(rendered_template.decode('utf8'), response.data.decode('utf8'))

    def test_user(self):
        response = self.client.get(path='/user')
        return self.assertDictEqual({'user_status':users.is_current_user_admin()},response.json)

    def test_redirect_on_search(self):
        response = self.client.get((url_for('index', q="test redirect on search")))  # cre

        return self.assertStatus(response, 302)

    def test_feed(self):
        category_key = self.categories.add("category")
        existing_tags = ["a new tag", "a new new tag"]
        existing_tag_keys = self.tags.add(existing_tags)

        self.posts.add("about", "body text", category_key, existing_tag_keys)

        response = self.client.get(path='/recent.atom')

        feed = AtomFeed('Recent Articles',
                        feed_url='http://localhost/recent.atom', url=request.url_root)

        feed = self.posts.add_to_feed(feed, request.url)

        return self.assertEqual(feed.to_string(), response.data.decode('utf8'))

    def test_rebuild_index(self):
        category_key = self.categories.add("category")
        existing_tags = ["a new tag", "a new new tag"]
        existing_tag_keys = self.tags.add(existing_tags)

        self.posts.add("about", "body text", category_key, existing_tag_keys)

        response = self.client.get(path='/rebuild_index')

        return self.assertStatus(response, 302)

    def test_api_answers_post_method(self):
        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary",
                       [{"p_answer":"ans1", "is_correct":True},{"p_answer":"ans2","is_correct":False}])


        json_data_f = {"p_answer":"ans2","is_correct":"True"}

        response = self.client.post(url_for('answers', title="a title"), content_type='application/json',
                                    data=json.dumps(json_data_f))#, headers={"csrf_token":csrf_token})

        self.assertDictEqual({u'msg': u'Sorry, no attempts left!', u'result': False,
                              u'remaining_attempts': 0,u'alert_type':u'warning',
                              u'answers_stats':{}}, response.json)

        json_data_f = {"p_answer": "ans2", "is_correct": "True"}
        response = self.client.post(url_for('answers', title="a title"), content_type='application/json',
                                    data=json.dumps(json_data_f))

        self.assertDictEqual({u'msg': u'Sorry, no attempts left!',u'alert_type':u'warning', u'result': False,
                              u'remaining_attempts':-1,
                              u'answers_stats': {}
                              }, response.json)

    def test_api_answers_post_method_correct_guess(self):
        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary",
                       [{"p_answer": "ans1", "is_correct": True}, {"p_answer": "ans2", "is_correct": False}])

        json_data_f = {"p_answer": "ans1", "is_correct": "True"}

        response = self.client.post(url_for('answers', title="a title"), content_type='application/json',
                                    data=json.dumps(json_data_f))  # , headers={"csrf_token":csrf_token})

        self.assertDictEqual({u'msg': u'Great!', u'result': True,
                              u'remaining_attempts': 0, u'alert_type': u'success',
                              u'answers_stats': {u'Answer': u'Selection', u'ans1': 1, u'ans2': 0}}, response.json)

    def test_is_cookie_set(self):
        with app.test_client() as c:
            c.post(url_for('ga_accept'), follow_redirects=True)

            c_value = request.cookies.get('ga_accepted')

            self.assertEqual(c_value,  'True')

    def test_is_cookie_set_false(self):
        with app.test_client() as c:
            c.post(url_for('ga_decline'), follow_redirects=True)

            c_value = request.cookies.get('ga_accepted')

            self.assertEqual(c_value, 'False')

    def test_accept_google_analytics(self):
        with app.test_client() as c:
            c.post(url_for('ga_accept'), follow_redirects=True)
            accept_google_analytics()
            self.assertTrue(app.jinja_env.globals['ga_accepted'])

        with app.test_client() as c:
            c.post(url_for('ga_decline'), follow_redirects=True)
            accept_google_analytics()
            self.assertFalse(app.jinja_env.globals['ga_accepted'])

    def test_questions_view(self):
        category_key = self.categories.add("reconstructing a test")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title", "body text", category_key, new_tag_keys, "this is a summary",
                       [{"p_answer": "ans1", "is_correct": True}, {"p_answer": "ans2", "is_correct": False}])

        category_key = self.categories.add("reconstructing a test")
        test_tags = ["a tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title here", "body to test the question text",
                       category_key, new_tag_keys, "this is a summary",
                       [{"p_answer": "a test answ correct", "is_correct": True},
                        {"p_answer": "a wrong tet answer", "is_correct": False}])

        response = self.client.get(path="/questions/reconstructing a test")

        self.posts.filter_by_category("reconstructing a test")

        flash(MSG)
        passed_days, remaining_days = calculate_work_date_stats()
        site_updated = self.posts.site_last_updated()
        self.posts.to_answers_form()

        rendered_template = render_template("questions.html", user_status=users.is_current_user_admin(),
                                            siteupdated=site_updated, \
                                            daysleft=remaining_days, dayspassed=passed_days,
                                            tags=self.tags, categories=self.categories,
                                            posts=self.posts,
                                            codeversion=CODEVERSION)


        self.assertEqualHTML(rendered_template.decode('utf8'), response.data.decode('utf8'))

    def test_redirect_nonwww(self):
        app.config['SERVER_NAME'] = "arsakian.com"
        with app.test_request_context():

            with app.test_client() as c:
                response = c.get(url_for('index', _external=True))
                self.assertEqual(response.location, "http://www.arsakian.com/")

                response = c.get(url_for('archives', _external=True))
                self.assertEqual(response.location, "http://www.arsakian.com/archives")
        app.config['SERVER_NAME'] = None

    def test_send_image_file(self):

        with open(os.path.join(TEST_IMAGE)) as f:
            img_stringIO = StringIO.StringIO(f.read())  # in memory read

        post, _, _ = self.create_post()
        image_key = post.add_blob(img_stringIO.read(), TEST_IMAGE, 'image/jpeg')

        response = self.client.get(path='/images/{}'.format(TEST_IMAGE),
                                      content_type='multipart/form-data',
                                      follow_redirects=True)

        with open(os.path.join(TEST_IMAGE)) as f:

            self.assertEqual(f.read(), response.data)

        # with app.test_client() as c:
        #     accept_google_analytics()
        #
        #     self.assertRaises(cloudstorage.NotFoundError, c.get(path='/images/{}'.format("non existent"),
        #                           content_type='multipart/form-data',
        #                           follow_redirects=True))

    def test_delete_image_from_a_post(self):
        with open(os.path.join(TEST_IMAGE)) as f:
            img_stringIO = StringIO.StringIO(f.read())  # in memory read

        post, _, _ = self.create_post()
        image_key = post.add_blob(img_stringIO.read(), TEST_IMAGE, 'image/jpeg')

        response = self.client.delete(url_for('delete_post_images', id=post.id, filename=TEST_IMAGE))

        self.assertEqual("file deleted", response.json["msg"])
Beispiel #15
0
class TestModels(BlogTestBase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        # Then activate the testbed, which prepares the service stubs for use.
        self.testbed.activate()
        # Next, declare which service stubs you want to use.
        self.testbed.init_datastore_v3_stub()
        # enable memcache
        self.testbed.init_memcache_stub()

        self.testbed.init_user_stub()

        self.testbed.init_blobstore_stub()

        self.testbed.init_app_identity_stub()

        self.testbed.init_urlfetch_stub()

        self.testbed.init_search_stub(enable=True)
        # Clear ndb's in-context cache between tests.
        # This prevents data from leaking between tests.
        # Alternatively, you could disable caching by
        # using ndb.get_context().set_cache_policy(False)
        ndb.get_context().clear_cache()

        self.tags = Tags()
        self.categories = Categories()
        self.posts = Posts()

    def create_answers(self, answers):
        answers_keys = [
            Answer(p_answer=ans, is_correct=is_correct)
            for ans, is_correct in answers.items()
        ]
        return answers_keys

    def create_post_with_answers(self, answers, category="a category"):

        test_tags = ["a new tag", "a new new tag"]
        tag_keys = self.tags.add(test_tags)
        answers_keys = self.create_answers(answers)

        category_key = self.categories.add(category)
        summary = "a summmary"
        title = "a title"
        body = "here is a body"

        post_key = BlogPost(title=title,
                            body=body,
                            category=category_key,
                            tags=tag_keys,
                            summary=summary,
                            answers=answers_keys).put()

        return post_key.get(), category_key, tag_keys, answers_keys

    def test_add_a_tag(self):
        tag_keys = self.tags.add(["a new tag"])
        self.assertEqual("a new tag", tag_keys[0].get().tag)

    def test_add_a_tag_once(self):
        self.tags.add(["a new tag"])
        tags_keys = self.tags.add(["a new tag", "a really new tag"])

        self.assertEqual(len(self.tags), 2)
        self.assertEqual(self.tags.get_keys(["a new tag", "a really new tag"]),
                         tags_keys)

    def test_add_tags(self):
        tag_keys = self.tags.add(["a new tag", "a second new tag"])
        self.assertItemsEqual(["a new tag", "a second new tag"],
                              [tag_keys[0].get().tag, tag_keys[1].get().tag])

    def test_delete_a_tag(self):
        self.tags.add(["a new tag"])
        self.tags.delete("a new tag")
        self.assertItemsEqual([], self.tags)

    def test_delete_tags(self):
        self.tags.add(["a new tag", "a second new tag"])
        self.tags.delete(["a new tag", "a second new tag"])
        self.assertItemsEqual([], self.tags)

    def test_get_keys_of_tags(self):
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.assertItemsEqual(new_tag_keys, self.tags.get_keys(test_tags))

    def test_add_a_category(self):
        category_key = self.categories.add("category")
        self.assertEqual("category", category_key.get().category)

    def test_add_a_category_once(self):
        category_key = self.categories.add("category")
        self.assertEqual("category", category_key.get().category)
        self.categories.add("category")
        self.assertEqual(len(self.categories), 1)

    def test_delete_a_category(self):
        category_key = self.categories.add("category")
        self.categories.delete(category_key)
        self.assertItemsEqual([], self.categories)

    def test_get_key_of_a_category(self):
        self.assertEqual(self.categories.add("category"),
                         self.categories.get_key("category"))

    def test_add_a_post(self):

        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        post_key = self.posts.add("a title", "body text", category_key,
                                  new_tag_keys, "this is a summary")

        self.assertEqual("a title", post_key.get().title)
        self.assertEqual("body text", post_key.get().body)
        self.assertEqual("this is a summary", post_key.get().summary)
        self.assertEqual(category_key, post_key.get().category)
        self.assertItemsEqual(new_tag_keys, post_key.get().tags)

    def test_get_tags_from_posts(self):
        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        self.posts.add("a title", "body text", category_key, new_tag_keys)

        self.assertItemsEqual(test_tags, self.posts.get_tags())

    def test_get_empty_tags_from_posts(self):
        category_key = self.categories.add("category")

        test_tags = []
        new_tag_keys = self.tags.add(test_tags)

        self.posts.add("a title", "body text", category_key, new_tag_keys)

        self.assertItemsEqual(test_tags, self.posts.get_tags())

    def test_get_tags_from_a_post(self):
        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        self.posts.add("a title", "body text", category_key, new_tag_keys)
        for post in self.posts:
            self.assertItemsEqual(test_tags, post.get_tag_names())

    def test_get_other_tags_from_a_post(self):
        category_key = self.categories.add("category")

        test_tags1 = ["a new tag", "a new new tag"]
        test_tags2 = ["a new tag 1", "a new new tag"]

        new_tag_keys1 = self.tags.add(test_tags1)
        new_tag_keys2 = self.tags.add(test_tags2)

        post_key1 = self.posts.add("a title", "body text", category_key,
                                   new_tag_keys1)
        self.posts.add("a title 2", "body text 2", category_key, new_tag_keys2)

        self.assertItemsEqual(test_tags2,
                              self.posts.get_other_tags(post_key1.id()))

    def test_find_modified_tags(self):
        test_existing_tags = ["a new tag", "a new new tag"]
        editing_tags1 = ["a new tag 1", "a new new tag 2"]
        editing_tags2 = ["a new tag 1", "a new tag"]

        modified_tags = find_modified_tags(editing_tags1, test_existing_tags)
        self.assertItemsEqual(modified_tags, editing_tags1)

        modified_tags = find_modified_tags(editing_tags2, test_existing_tags)
        self.assertItemsEqual(modified_tags, ["a new tag 1"])

    def test_find_tags_to_be_deleted(self):
        category_key = self.categories.add("category")

        other_tags = ["a new tag 3", "a new new tag"]
        test_existing_tags = ["a new tag", "a new new tag"]
        editing_tags1 = ["a new tag 1", "a new new tag 2"]
        editing_tags2 = ["a new tag 1", "a new tag"]

        # scenario to delete tags "a new tag",
        non_modified_tags = set(editing_tags1) & set(test_existing_tags)

        tags_to_be_removed = find_tags_to_be_removed(test_existing_tags,
                                                     non_modified_tags,
                                                     other_tags)
        self.assertItemsEqual(tags_to_be_removed, ["a new tag"])

        # scenario to delete all tags
        non_modified_tags = set(editing_tags1) & set(test_existing_tags)
        tags_to_be_removed = find_tags_to_be_removed(test_existing_tags,
                                                     non_modified_tags, [])
        self.assertItemsEqual(tags_to_be_removed, test_existing_tags)
        # scenario not to delete any tag
        tags_to_be_removed = find_tags_to_be_removed(test_existing_tags, [],
                                                     test_existing_tags)
        self.assertItemsEqual(tags_to_be_removed, [])

    def test_find_tags_to_be_added_from_an_edited_post(self):
        category_key = self.categories.add("category")

        test_existing_tags = ["a new tag", "a new new tag"]
        editing_tags1 = ["a new tag 1", "a new new tag 2"]
        editing_tags2 = ["a new tag 1", "a new tag"]

        tag_keys = self.tags.add(test_existing_tags)

        self.posts.add("a title", "body text", category_key, tag_keys)

        # scenario to add all tags "a new tag", "a new new tag"
        tags_to_be_added = find_modified_tags(editing_tags1,
                                              test_existing_tags)
        self.assertItemsEqual(tags_to_be_added, editing_tags1)

        # scenario to add one tag "a new tag 1"
        tags_to_be_added = find_modified_tags(editing_tags2,
                                              test_existing_tags)
        self.assertItemsEqual(tags_to_be_added, ["a new tag 1"])

        # scenario not to delete any tag
        tags_to_be_added = find_modified_tags(test_existing_tags,
                                              test_existing_tags)
        self.assertItemsEqual(tags_to_be_added, [])

    def test_edit_post(self):
        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        post_key = self.posts.add("a title", "body text", category_key,
                                  new_tag_keys)

        post = post_key.get()
        post.edit("a modified title", "a modified body text", datetime.now(),
                  new_tag_keys, category_key)

        self.assertEqual("a modified title", post_key.get().title)
        self.assertEqual("a modified body text", post_key.get().body)
        self.assertEqual(category_key, post_key.get().category)
        self.assertItemsEqual(new_tag_keys, post_key.get().tags)

    def test_get_answers(self):
        post, _, _, _ = self.create_post_with_answers({
            "ans1": True,
            "ans2": False,
            "ans3": False
        })

        self.assertItemsEqual(post.get_answers(), [{
            u'is_correct': True,
            u'p_answer': u'ans1'
        }, {
            u'is_correct': False,
            u'p_answer': u'ans2'
        }, {
            u'is_correct': False,
            u'p_answer': u'ans3'
        }])

    def test_edit_post_answers(self):
        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        post, _, _, _ = self.create_post_with_answers({
            "ans1": True,
            "ans2": False,
            "ans3": False
        })
        post.edit("a modified title",
                  "a modified body text",
                  datetime.now(),
                  new_tag_keys,
                  category_key,
                  "",
                  raw_answers=[{
                      u'is_correct': True,
                      u'p_answer': u'ans1'
                  }, {
                      u'is_correct': True,
                      u'p_answer': u'ans2_mod'
                  }, {
                      u'is_correct': False,
                      u'p_answer': u'ans3'
                  }])

        self.assertItemsEqual(post.get_answers(), [{
            u'is_correct': True,
            u'p_answer': u'ans1'
        }, {
            u'is_correct': True,
            u'p_answer': u'ans2_mod'
        }, {
            u'is_correct': False,
            u'p_answer': u'ans3'
        }])

    def test_statistics_when_editing_a_post(self):
        post, category_key, tags_key, _ = self.create_post_with_answers({
            "ans1":
            True,
            "ans2":
            False,
            "ans3":
            False
        })
        post.set_selected_answer("ans1")
        post.set_selected_answer("ans1")

        self.assertEqual(post.get_answers_statistics(), {
            "Answer": "Selection",
            u"ans1": 2,
            u"ans2": 0,
            u"ans3": 0
        })
        post.edit("a modified title",
                  "a modified body text",
                  datetime.now(),
                  tags_key,
                  category_key,
                  "",
                  raw_answers=[{
                      u'is_correct': True,
                      u'p_answer': u'ans1'
                  }, {
                      u'is_correct': True,
                      u'p_answer': u'ans2_mod'
                  }, {
                      u'is_correct': False,
                      u'p_answer': u'ans3'
                  }])

        self.assertEqual(post.get_answers_statistics(), {
            "Answer": "Selection",
            u"ans1": 2,
            u"ans2_mod": 0,
            u"ans3": 0
        })

    def test_delete_post(self):
        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        post_key = self.posts.add("a title", "body text", category_key,
                                  new_tag_keys)

        self.posts.delete(post_key)
        self.assertItemsEqual(self.posts, [])

    def test_find_tags_to_be_added(self):

        test_existing_tags = ["a new tag", "a new new tag"]
        editing_tags = ["a new tag 1", "a new new tag 2"]
        editing_tags2 = ["a new tag", "a new new tag 2"]

        non_modified_tags = set(editing_tags) & set(test_existing_tags)
        tags_to_be_added = find_tags_to_be_added(editing_tags,
                                                 non_modified_tags,
                                                 test_existing_tags)

        # scenario to add all tags "a new tag 1", "a new new tag 2"
        self.assertItemsEqual(editing_tags, tags_to_be_added)

        # scenario to add one tag "a new new tag 2"
        non_modified_tags = set(editing_tags2) & set(test_existing_tags)
        tags_to_be_added = find_tags_to_be_added(editing_tags2,
                                                 non_modified_tags,
                                                 test_existing_tags)

        self.assertItemsEqual(["a new new tag 2"], tags_to_be_added)

    def test_to_json_of_posts(self):
        category_key1 = self.categories.add("category 1")
        category_key2 = self.categories.add("category 2")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        post_key2 = self.posts.add("a new title", "new body text",
                                   category_key2, new_tag_keys, "a summary  2")
        post_key1 = self.posts.add("a title", "body text", category_key1,
                                   new_tag_keys, "a summary")

        post2 = post_key2.get()

        with open(os.path.join(TEST_IMAGE)) as f:
            self.assertTrue(post2.add_blob(f.read(), TEST_IMAGE, 'image/jpeg'))

        with open(os.path.join(TEST_IMAGE2)) as f:
            self.assertTrue(post2.add_blob(f.read(), TEST_IMAGE2,
                                           'image/jpeg'))

        json_result = [{
            u'body':
            post_key1.get().body,
            u'category':
            post_key1.get().category.get().category,
            u'updated':
            datetimeformat(post_key1.get().updated),
            u'tags': [{
                "key": str(new_tag_keys[0]),
                "val": new_tag_keys[0].get().tag
            }, {
                "key": str(new_tag_keys[1]),
                "val": new_tag_keys[1].get().tag
            }],
            u'timestamp':
            datetimeformat(post_key1.get().timestamp),
            u'title':
            post_key1.get().title,
            u'id':
            str(post_key1.get().key.id()),
            u'summary':
            post_key1.get().summary,
            u'answers':
            post_key1.get().answers,
            u'images': []
        }, {
            u'body':
            post_key2.get().body,
            u'category':
            post_key2.get().category.get().category,
            u'updated':
            datetimeformat(post_key2.get().updated),
            u'tags': [{
                "key": str(new_tag_keys[0]),
                "val": new_tag_keys[0].get().tag
            }, {
                "key": str(new_tag_keys[1]),
                "val": new_tag_keys[1].get().tag
            }],
            u'timestamp':
            datetimeformat(post_key2.get().timestamp),
            u'title':
            post_key2.get().title,
            u'id':
            str(post_key2.get().key.id()),
            u'summary':
            post_key2.get().summary,
            u'answers':
            post_key2.get().answers,
            u'images': [{
                u'blob_key':
                u'encoded_gs_file:YXBwX2RlZmF1bHRfYnVja2V0LzIwMTlfMV80XzE2ei5naWY=',
                u'filename': TEST_IMAGE
            }, {
                u'blob_key':
                u'encoded_gs_file:YXBwX2RlZmF1bHRfYnVja2V0LzEyXzNfNF8zXzEyei5wbmc=',
                u'filename': TEST_IMAGE2
            }]
        }]
        self.assertEqual(json_result, self.posts.to_json())

    def test_retrieve_from_memcache(self):
        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        post_key = self.posts.add("a title", "body text", category_key,
                                  new_tag_keys)

        id = post_key.id()

        memcached_post = BlogPost.get(id)  # requested a post added to MEMCACHE

        self.assertEqual(memcached_post.key, post_key)

    def test_get_by_title(self):
        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        post_key = self.posts.add("a title", "body text", category_key,
                                  new_tag_keys)
        post = self.posts.get_by_title("a title")
        self.assertEqual(post_key, post.key)

    def test_get_by_title_assert_raises(self):
        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        self.posts.add("a title", "body text", category_key, new_tag_keys)
        # test exception
        with self.assertRaises(InvalidUsage):
            self.posts.get_by_title("a non existent title")

    def test_get_names_from_tags(self):
        test_tags = ["a new tag", "a new new tag"]
        self.tags.add(test_tags)

        self.assertItemsEqual(test_tags, self.tags.get_names())

    def test_to_json_of_a_tag(self):
        test_tags = ["a new tag", "a new new tag"]
        tag_key1, tag_key2 = self.tags.add(test_tags)
        tag = tag_key1.get()

        test_dict = {"id": str(tag_key1.id()), "tag": u"a new tag"}

        self.assertDictEqual(test_dict, tag.to_json())

    def test_to_json_of_tags(self):
        test_tags = [u"a new tag", u"a new new tag"]
        tag_key1, tag_key2 = self.tags.add(test_tags)

        json_data = [{
            "id": key,
            "tag": val
        } for key, val in zip(
            [str(tag_key1.id()), str(tag_key2.id())], test_tags)]

        self.assertListEqual(json_data, self.tags.to_json())

    def test_get_a_post(self):
        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        post_key = self.posts.add("a title", "body text", category_key,
                                  new_tag_keys)

        #test with no memcache
        post = BlogPost.get(post_key.id())
        self.assertEqual(post.key, post_key)

        #test memcached
        post = BlogPost.get(post_key.id())
        self.assertEqual(post.key, post_key)

    # def test_filter_posts_by_a_tag(self):
    #     category_key = self.categories.add("category")
    #     test_tags = ["a new tag", "a new new tag"]
    #     new_test_tags = ["a second tag", "a new second tag"]
    #     new_tag_keys = self.tags.add(test_tags)
    #     new_test_tag_keys = self.tags.add(new_test_tags)
    #     post_key = self.posts.add("a title", "body text", category_key, new_tag_keys)
    #     self.posts.add("a title", "a second body text", category_key, new_test_tag_keys )
    #     print self.posts
    #     self.posts.filter_by_tag("a new tag")
    #     print self.posts, post_key.get()
    #     self.assertItemsEqual(self.posts, [post_key.get()])

    # def test_filter_posts_by_category(self):
    #
    #     post1, _, _, _ = self.create_post_with_answers({"ans1": True, "ans2": False}, category="cat 1")
    #     post2, _, _, _ = self.create_post_with_answers({"ans1": True, "ans2": False}, category="cat 2")
    #
    #     self.posts.filter_by_category("cat 1")
    #     print self.posts[0], post2
    #     self.assertItemsEqual(self.posts, [post2])
    #
    #     self.posts.filter_by_category("cat 1")
    #
    #     self.assertItemsEqual(self.posts, [post1])
    #
    #     self.posts.filter_by_category("wrong cat")
    #
    #     self.assertItemsEqual(self.posts, [])

    def test_get_category(self):
        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        post_key = self.posts.add("a title", "body text", category_key,
                                  new_tag_keys)

        post = BlogPost.get(post_key.id())

        self.assertEqual("category", post.get_category())

    def test_get_tagnames(self):
        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        post_key = self.posts.add("a title", "body text", category_key,
                                  new_tag_keys)

        post = BlogPost.get(post_key.id())

        tag_names = post.get_tag_names()

        self.assertItemsEqual(test_tags, tag_names)

    def test_posts_contains_a_post(self):
        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        post_key = self.posts.add("a title", "body text", category_key,
                                  new_tag_keys)

        self.assertTrue(post_key in self.posts)

        self.assertFalse("no key" in self.posts)

    def test_tags_contains_a_tag(self):
        test_tags = ["a new tag", "a new new tag"]
        self.tags.add(test_tags)

        self.assertTrue(test_tags[0] in self.tags)

        self.assertFalse("dfsd" in self.tags)

    def test_categories_contains_a_category(self):
        self.categories.add("category")

        self.assertTrue("category" in self.categories)

        self.assertFalse("" in self.categories)

    # def test_filter_matched(self):
    #     category_key = self.categories.add("category")
    #     test_tags = ["a new tag", "a new new tag"]
    #     new_tag_keys = self.tags.add(test_tags)
    #     post_key = self.posts.add("a title", "body text", category_key, new_tag_keys)
    #     self.posts.add("a title", "body sec2 text", category_key, new_tag_keys)
    #     print self.posts
    #     self.posts.filter_matched([post_key.id()])
    #     self.assertItemsEqual(self.posts, [post_key.get()])

    def test_site_last_updated(self):
        freezer = freeze_time("2017-11-29 17:48:18")
        freezer.start()
        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        self.posts.add("a title", "body text", category_key, new_tag_keys)
        self.posts.add("a title", "body sec2 text", category_key, new_tag_keys)

        last_updated = self.posts.site_last_updated()
        self.assertEqual("Wednesday 29 November 2017", last_updated)
        freezer.stop()

    def test_get_related_posts(self):
        category_key = self.categories.add("category")
        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)
        current_post = self.posts.add("a title", "body text", category_key,
                                      new_tag_keys)

        rel_test_tags = ["a new tag", "a different tag"]
        rel_tag_keys = self.tags.add(rel_test_tags)
        rel_post_key = self.posts.add("a different title", "body sec2 text",
                                      category_key, rel_tag_keys)
        rel_post = BlogPost.get(rel_post_key.id())

        related_posts = self.posts.get_related_posts(current_post.id())

        self.assertListEqual([rel_post], related_posts)

    def test_update_category(self):
        category_key = self.categories.add("category")

        self.categories.update("a modified category", category_key)
        category = self.categories.get(category_key)

        self.assertEqual("a modified category", category.category)

    def test_update_category_without_key(self):
        category_key = self.categories.update("a modified category")
        category = self.categories.get(category_key)

        self.assertEqual("a modified category", category.category)

    def test_update_tags_without_post(self):
        test_tags = ["a new tag", "a new new tag"]
        tag_keys = self.tags.add(test_tags)

        category_key = self.categories.add("category")
        self.posts.add("a title", "body text", category_key, tag_keys)

        test_new_tags = ["a new different tag", "a new new tag"]
        self.tags.update(test_new_tags)
        tag_names = self.tags.get_names()

        self.assertListEqual(
            tag_names,
            [u"a new tag", u"a new new tag", u"a new different tag"])

    def test_update_tags(self):
        """
        replacing a new tag with a new different tag
        :return:
        """
        test_tags = ["a new tag", "a new new tag"]
        tag_keys = self.tags.add(test_tags)

        category_key = self.categories.add("category")
        post_key = self.posts.add("a title", "body text", category_key,
                                  tag_keys)

        test_new_tags = ["a new different tag", "a new new tag"]
        self.tags.update(test_new_tags, BlogPost.get(post_key.id()))
        tag_names = self.tags.get_names()

        self.assertListEqual(tag_names,
                             [u"a new new tag", u"a new different tag"])

    def test_rebuild_index(self):
        test_tags = ["a new tag", "a new new tag"]
        tag_keys = self.tags.add(test_tags)

        category_key = self.categories.add("category")
        post_key = self.posts.add("a title", "body text", category_key,
                                  tag_keys)

        self.posts.rebuild_index()

        results = query_search_index("body")
        posts_ids = find_posts_from_index(results)

        self.assertEqual(post_key.id(), posts_ids[0])

    def test_add_to_feed(self):
        test_tags = ["a new tag", "a new new tag"]
        tag_keys = self.tags.add(test_tags)

        category_key = self.categories.add("category")
        self.posts.add("a title", "body text", category_key, tag_keys)

        feed_org = AtomFeed('Recent Articles',
                            feed_url='http://localhost/recent.atom',
                            url="")

        feed_model = AtomFeed('Recent Articles',
                              feed_url='http://localhost/recent.atom',
                              url="")

        for post in self.posts:
            catname = post.get_category()
            url = "/".join([
                catname,
                post.timestamp.strftime('%B'),
                post.timestamp.strftime('%Y')
            ])
            feed_org.add(post.title,
                         post.body,
                         content_type='html',
                         author='Armen Arsakian',
                         url=make_external("http://localhost/recent.atom",
                                           url),
                         updated=post.updated,
                         published=post.timestamp)

        feed = self.posts.add_to_feed(feed_model,
                                      "http://localhost/recent.atom")

        self.assertEqual(feed_org.to_string(), feed.to_string())

    def test_stripped_answers(self):
        test_tags = ["a new tag", "a new new tag"]
        tag_keys = self.tags.add(test_tags)

        ans1 = Answer(p_answer="ans1", is_correct=True)

        ans2 = Answer(p_answer="ans2", is_correct=False)

        category_key = self.categories.add("category")
        summary = "a summmary"
        title = "a title"
        body = "here is a body"

        post_key = BlogPost(title=title,
                            body=body,
                            category=category_key,
                            tags=tag_keys,
                            summary=summary,
                            answers=[ans1, ans2]).put()

        post = post_key.get()
        jsoned_answers = [{
            "p_answer": "ans1",
            "is_correct": False
        }, {
            "p_answer": "ans2",
            "is_correct": False
        }]

        self.assertItemsEqual(post.strip_answers_jsoned(), jsoned_answers)

    def test_selected_answer_setter(self):
        post, _, _, _ = self.create_post_with_answers({
            "ans1": True,
            "ans2": False
        })
        ans1 = Answer(p_answer="ans1", is_correct=True)

        post.set_selected_answer("ans1")

        self.assertEqual(
            Answer(is_correct=True,
                   nof_times_selected=1,
                   p_answer=u'ans1',
                   statistics=1.0), post.selected_answer)

    def test_is_answer_correct(self):
        post, _, _, _ = self.create_post_with_answers({
            "ans1": True,
            "ans2": False
        })
        post.set_selected_answer("ans1")

        self.assertTrue(post.is_answer_correct())

        post.set_selected_answer('ans2')
        self.assertFalse(post.is_answer_correct())

        post.set_selected_answer('non existent')
        self.assertFalse(post.is_answer_correct())

    def test_to_answer_form(self):
        post, _, _, _ = self.create_post_with_answers({
            "ans1": True,
            "ans2": False
        })
        self.posts.to_answers_form()

        self.assertItemsEqual([(u'ans1', u'ans1'), (u'ans2', u'ans2')],
                              post.answers_form.r_answers.choices)

    def test_update_answers_statistics(self):
        post, _, _, _ = self.create_post_with_answers({
            "ans1": True,
            "ans2": False
        })

        post.set_selected_answer("ans1")

        self.assertTupleEqual(
            (post.answers[0].statistics, post.answers[1].statistics),
            (1.0, 0.0))
        self.assertTupleEqual((post.answers[0].nof_times_selected,
                               post.answers[1].nof_times_selected), (1, 0))

        post.set_selected_answer("ans2")

        self.assertTupleEqual(
            (post.answers[0].statistics, post.answers[1].statistics),
            (0.5, 0.5))
        self.assertTupleEqual((post.answers[0].nof_times_selected,
                               post.answers[1].nof_times_selected), (1, 1))

        post.set_selected_answer("ans2")

        self.assertAlmostEqual(post.answers[0].statistics, 0.3333, places=4)
        self.assertAlmostEqual(post.answers[1].statistics,
                               0.6666666666666666,
                               places=4)
        self.assertTupleEqual((post.answers[0].nof_times_selected,
                               post.answers[1].nof_times_selected), (1, 2))

    def test_get_answers_statistics(self):
        post, _, _, _ = self.create_post_with_answers({
            "ans1": True,
            "ans2": False,
            "ans3": False
        })
        post.set_selected_answer("ans1")

        answers_stats = post.get_answers_statistics()

        self.assertDictEqual(answers_stats, {
            "Answer": "Selection",
            "ans1": 1,
            "ans2": 0,
            "ans3": 0
        })

        post.set_selected_answer("ans2")

        answers_stats = post.get_answers_statistics()

        self.assertDictEqual(answers_stats, {
            "Answer": "Selection",
            "ans1": 1,
            "ans2": 1,
            "ans3": 0
        })

        answers_stats = post.get_answers_statistics()
        self.assertDictEqual(answers_stats, {
            "Answer": "Selection",
            u"ans1": 1,
            u"ans2": 1,
            u"ans3": 0
        })

    def test_add_blob(self):
        post, _, _ = self.create_post()

        with open(os.path.join(TEST_IMAGE)) as f:
            image_key = post.add_blob(f.read(), TEST_IMAGE, 'image/jpeg')
            self.assertEqual(
                image_key,
                u'encoded_gs_file:YXBwX2RlZmF1bHRfYnVja2V0LzIwMTlfMV80XzE2ei5naWY='
            )

    def test_delete_blob(self):
        from google.appengine.ext import blobstore
        post, _, _ = self.create_post()

        with open(os.path.join(TEST_IMAGE)) as f:
            image_key = post.add_blob(f.read(), TEST_IMAGE, 'image/jpeg')

        post._delete_blob(TEST_IMAGE)
        with self.assertRaises(blobstore.BlobNotFoundError):
            blobstore.fetch_data(image_key, 0, 1)

    def test_read_blob_image(self):
        post, _, _ = self.create_post()
        with open(os.path.join(TEST_IMAGE)) as f:
            post.add_blob(f.read(), TEST_IMAGE, 'image/jpeg')
            image_file = post.read_blob_image(TEST_IMAGE)

            f.seek(0)
            self.assertEqual(image_file, f.read())

    def test_list_images(self):
        post, _, _ = self.create_post()
        with open(os.path.join(TEST_IMAGE)) as f:
            post.add_blob(f.read(), TEST_IMAGE, 'image/jpeg')
        self.assertListEqual(post.list_images(),
                             ['/app_default_bucket/{}'.format(TEST_IMAGE)])

    def test_mime_type(self):
        post, _, _ = self.create_post()
        with open(os.path.join(TEST_IMAGE)) as f:
            post.add_blob(f.read(), TEST_IMAGE, 'image/jpeg')
        self.assertEqual(post.get_mime_type(TEST_IMAGE), 'image/jpeg')

    def test_delete_image(self):
        post, _, _ = self.create_post()
        with open(os.path.join(TEST_IMAGE)) as f:
            image_key = post.add_blob(f.read(), TEST_IMAGE, 'image/jpeg')

        post._delete_blob(TEST_IMAGE)
        with self.assertRaises(cloudstorage.NotFoundError):
            post.get_blob(image_key)

    def test_delete_blob_from_post(self):
        post, _, _ = self.create_post()
        with open(os.path.join(TEST_IMAGE)) as f:
            post.add_blob(f.read(), TEST_IMAGE, 'image/jpeg')

        self.assertEqual(1, len(post.images))

        post.delete_blob_from_post(TEST_IMAGE)

        self.assertEqual(0, len(post.images))
Beispiel #16
0
class TestForms(BlogTestBase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        # Then activate the testbed, which prepares the service stubs for use.
        self.testbed.activate()
        # Next, enable csrf for proper rendering of forms
        self.app.config['WTF_CSRF_ENABLED'] = True
        self.testbed.init_user_stub()

        self.testbed.init_blobstore_stub()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_app_identity_stub()

        self.testbed.init_urlfetch_stub()
        # enable memcache
        self.testbed.init_memcache_stub()
        self.categories = Categories()
        self.tags = Tags()

    def test_post_form_names(self):
        form = PostForm()
        self.assertEqual(form.title.name, 'title')
        self.assertEqual(form.body.name, 'body')
        self.assertEqual(form.summary.name, 'summary')
        self.assertEqual(form.category.name, 'category')
        self.assertEqual(form.images_upload.name, 'images_upload')
        self.assertEqual(form.images.name, 'images')

    def test_hidden_form(self):
        form = PostForm()

        out = form.hidden_tag()
        answer_form = AnswerRadioForm()
        answer_out = answer_form.hidden_tag()
        assert (all(x in out for x in ('csrf_token')))
        assert (all(x in answer_out for x in ('csrf_token')))

    def test_with_data_using_obj(self):

        category_key = self.categories.add("category")

        test_tags = ["a new tag", "a new new tag"]
        new_tag_keys = self.tags.add(test_tags)

        answer = Answer(p_answer="a test answer", is_correct=False)

        post = BlogPost(title="a title",
                        body="body text",
                        category=category_key,
                        tags=new_tag_keys,
                        summary="this is a summary",
                        answers=[answer])

        post.put()
        with open(os.path.join(TEST_IMAGE)) as f:
            self.assertTrue(post.add_blob(f.read(), TEST_IMAGE, 'image/jpeg'))

        form = PostForm(obj=post)
        # form.answers.append_entry(answer_field)
        #print (form.answers)

        self.assertEqual(form.title.data, "a title")
        self.assertEqual(form.body.data, "body text")
        self.assertEqual(form.answers[0].p_answer.data, "a test answer")
        self.assertEqual(form.images[0].filename.data, TEST_IMAGE)

    def test_with_data_using_dict(self):
        class DummyPostData(dict):
            def getlist(self, key):
                v = self[key]
                if not isinstance(v, (list, tuple)):
                    v = [v]
                return v

        postdict = DummyPostData({
            u'body':
            u'body text',
            u'category':
            u'category',
            u'updated':
            'Monday, 16 April 2018',
            u'tags': [u'a new tag', u'a new new tag'],
            u'timestamp':
            'Monday, 16 April 2018',
            u'title':
            u'a title',
            u'answers': [{
                'is_correct': False,
                'p_answer': u'a test answer'
            }],
            u'summary':
            u'this is a summary',
            u'id':
            '4'
        })

        form = PostForm(postdict)

        form.answers.append_entry([{
            'is_correct': False,
            'p_answer': u'a test answer'
        }])
        self.assertEqual(form.title.data, "a title")
        self.assertEqual(form.body.data, "body text")

    # self.assertEqual(form.answers[0].p_answer.data, "a test answer")

    def test_answers_radio_form(self):

        answers = [("a correct answer", ""), ("a wrong answer", "")]
        form = AnswerRadioForm()
        form.r_answers.data = "a test answer"
        self.assertEqual(form.r_answers.data, "a test answer")

    def tearDown(self):
        self.app.config['WTF_CSRF_ENABLED'] = False