You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2019/11/18 17:34:04 UTC

[allura] 01/08: [#8340] tracker test coverage and remove dead code

This is an automated email from the ASF dual-hosted git repository.

brondsem pushed a commit to branch db/8340
in repository https://gitbox.apache.org/repos/asf/allura.git

commit e9fbaddd73796847885ccf122b88560184e9cc0b
Author: Dave Brondsema <da...@brondsema.net>
AuthorDate: Tue Nov 12 17:00:42 2019 -0500

    [#8340] tracker test coverage and remove dead code
---
 Allura/allura/lib/solr.py                          |  2 +-
 Allura/allura/model/monq_model.py                  | 12 +++--
 .../forgetracker/templates/tracker/bin.html        |  1 -
 .../forgetracker/templates/tracker/new_bin.html    | 27 -----------
 .../forgetracker/tests/functional/test_root.py     | 21 +++++++++
 ForgeTracker/forgetracker/tests/test_app.py        | 53 ++++++++++++++++++++++
 ForgeTracker/forgetracker/tracker_main.py          | 28 ++----------
 7 files changed, 86 insertions(+), 58 deletions(-)

diff --git a/Allura/allura/lib/solr.py b/Allura/allura/lib/solr.py
index 222fdef..e4adba8 100644
--- a/Allura/allura/lib/solr.py
+++ b/Allura/allura/lib/solr.py
@@ -161,7 +161,7 @@ class MockSOLR(object):
             if part in ('&&', 'AND'):
                 continue
             if part in ('||', 'OR'):
-                log.warn("MockSOLR doesn't implement OR yet; treating as AND")
+                log.warn("MockSOLR doesn't implement OR yet; treating as AND. q={} fq={}".format(q, fq))
                 continue
             if ':' in part:
                 field, value = part.split(':', 1)
diff --git a/Allura/allura/model/monq_model.py b/Allura/allura/model/monq_model.py
index b28ca12..3f48aae 100644
--- a/Allura/allura/model/monq_model.py
+++ b/Allura/allura/model/monq_model.py
@@ -98,6 +98,11 @@ class MonQTask(MappedClass):
     kwargs = FieldProperty({None: None})
     result = FieldProperty(None, if_missing=None)
 
+    sort = [
+        ('priority', ming.DESCENDING),
+        ('time_queue', ming.ASCENDING),
+    ]
+
     def __repr__(self):
         from allura import model as M
         project = M.Project.query.get(_id=self.context.project_id)
@@ -179,9 +184,6 @@ class MonQTask(MappedClass):
         and no tasks are available, return None.  If waitfunc raises a
         StopIteration, stop waiting for a task
         '''
-        sort = [
-            ('priority', ming.DESCENDING),
-            ('time_queue', ming.ASCENDING)]
         while True:
             try:
                 query = dict(state=state)
@@ -196,7 +198,7 @@ class MonQTask(MappedClass):
                             process=process)
                     },
                     new=True,
-                    sort=sort)
+                    sort=cls.sort)
                 if obj is not None:
                     return obj
             except pymongo.errors.OperationFailure, exc:
@@ -227,7 +229,7 @@ class MonQTask(MappedClass):
     def run_ready(cls, worker=None):
         '''Run all the tasks that are currently ready'''
         i = 0
-        for i, task in enumerate(cls.query.find(dict(state='ready')).all()):
+        for i, task in enumerate(cls.query.find(dict(state='ready')).sort(cls.sort).all()):
             task.process = worker
             task()
         return i
diff --git a/ForgeTracker/forgetracker/templates/tracker/bin.html b/ForgeTracker/forgetracker/templates/tracker/bin.html
index 2f33ff3..d919ee6 100644
--- a/ForgeTracker/forgetracker/templates/tracker/bin.html
+++ b/ForgeTracker/forgetracker/templates/tracker/bin.html
@@ -17,7 +17,6 @@
        under the License.
 -#}
 {% extends g.theme.master %}
-{% do g.register_forge_css('css/hilite.css') %}
 {% do g.register_app_css('css/tracker.css') %}
 
 {% block title %}{{c.project.name}} / {{app.config.options.mount_label}} / Saved Searches{% endblock %}
diff --git a/ForgeTracker/forgetracker/templates/tracker/new_bin.html b/ForgeTracker/forgetracker/templates/tracker/new_bin.html
deleted file mode 100644
index 6af78a7..0000000
--- a/ForgeTracker/forgetracker/templates/tracker/new_bin.html
+++ /dev/null
@@ -1,27 +0,0 @@
-{#-
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
--#}
-{% extends g.theme.master %}
-
-{% block title %}{{c.project.name}} / {{c.app.config.options.mount_label}} / New search for {{q}}{% endblock %}
-
-{% block header %}New search for {{q}}{% endblock %}
-
-{% block content %}
-{{c.bin_form.display(value=dict(summary=q,terms=q), action='save_bin')}}
-{% endblock %}
\ No newline at end of file
diff --git a/ForgeTracker/forgetracker/tests/functional/test_root.py b/ForgeTracker/forgetracker/tests/functional/test_root.py
index 5eb9315..4456465 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -354,6 +354,27 @@ class TestFunctionalController(TrackerTestController):
         r = self.app.get('/bugs/milestone_counts')
         assert_equal(r.body, json.dumps(counts))
 
+    def test_bin_counts(self):
+        self.new_ticket(summary='test new')
+        self.new_ticket(summary='test new private', private=True)
+        M.MonQTask.run_ready()
+
+        r = self.app.get('/bugs/bin_counts')
+        assert_equal(r.json, {"bin_counts": [{"count": 2, "label": "Changes"},
+                                             {"count": 0, "label": "Closed Tickets"},
+                                             {"count": 2, "label": "Open Tickets"}]})
+
+        """
+        forgetracker.model.ticket.Globals.bin_count doesn't do a permission check like corresponding milestone_count
+        
+        # Private tickets shouldn't be included in counts if user doesn't
+        # have read access to private tickets.
+        r = self.app.get('/bugs/bin_counts', extra_environ=dict(username='*anonymous'))
+        assert_equal(r.json, {"bin_counts": [{"count": 1, "label": "Changes"},
+                                             {"count": 0, "label": "Closed Tickets"},
+                                             {"count": 1, "label": "Open Tickets"}]})
+        """
+
     def test_milestone_progress(self):
         self.new_ticket(summary='Ticket 1', **{'_milestone': '1.0'})
         self.new_ticket(summary='Ticket 2', **{'_milestone': '1.0',
diff --git a/ForgeTracker/forgetracker/tests/test_app.py b/ForgeTracker/forgetracker/tests/test_app.py
index cfc0596..9128d30 100644
--- a/ForgeTracker/forgetracker/tests/test_app.py
+++ b/ForgeTracker/forgetracker/tests/test_app.py
@@ -24,14 +24,67 @@ from nose.tools import assert_equal, assert_true
 from tg import tmpl_context as c
 from cgi import FieldStorage
 from cStringIO import StringIO
+
+from alluratest.controller import setup_basic_test
 from ming.orm import ThreadLocalORMSession
 
 from allura import model as M
 from allura.tests import decorators as td
 from forgetracker import model as TM
+from forgetracker.site_stats import tickets_stats_24hr
 from forgetracker.tests.functional.test_root import TrackerTestController
 
 
+class TestApp(object):
+
+    def setUp(self):
+        setup_basic_test()
+
+    @td.with_tracker
+    def test_inbound_email(self):
+        ticket = TM.Ticket.new()
+        ticket.summary = 'test ticket'
+        ticket.description = 'test description'
+
+        # send a message with no ticket matching it
+        message_id = '123@localhost'
+        message = 'test message'
+        msg = dict(payload=message, message_id=message_id, headers={'Subject': 'test'})
+        c.app.handle_message('1', msg)
+        # message gets added as a post on the ticket
+        post = M.Post.query.get(_id=message_id)
+        assert_equal(post["text"], message)
+
+    @td.with_tracker
+    def test_inbound_email_no_match(self):
+        # send a message with no ticket matching it
+        message_id = '123@localhost'
+        message = 'test message'
+        msg = dict(payload=message, message_id=message_id, headers={'Subject': 'test'})
+        # no ticket matching it
+        c.app.handle_message('6789', msg)
+        # no new message
+        post = M.Post.query.get(_id=message_id)
+        assert_equal(post, None)
+
+    @td.with_tracker
+    def test_uninstall(self):
+        t = TM.Ticket.new()
+        t.summary = 'new ticket'
+        ThreadLocalORMSession.flush_all()
+        assert TM.Ticket.query.get(summary='new ticket')
+        # c.app.uninstall(c.project) errors out, but works ok in test_uninstall for repo tools.  So instead:
+        c.project.uninstall_app('bugs')
+        assert not TM.Ticket.query.get(summary='new ticket')
+
+    @td.with_tracker
+    def test_tickets_stats_24hr(self):
+        # invoked normally via entry point
+        TM.Ticket.new()
+        TM.Ticket.new()
+        assert_equal(2, tickets_stats_24hr())
+
+
 class TestBulkExport(TrackerTestController):
 
     @td.with_tracker
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index f4861a8..f7f6c63 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -282,7 +282,9 @@ class ForgeTrackerApp(Application):
         except:
             log.exception('Error getting ticket %s', topic)
             return
-        if ticket.discussion_disabled:
+        if not ticket:
+            log.info('No such ticket num: %s', topic)
+        elif ticket.discussion_disabled:
             log.info('Discussion disabled for ticket %s', ticket.ticket_num)
         else:
             self.handle_artifact_message(ticket, message)
@@ -647,7 +649,6 @@ class RootController(BaseController, FeedController):
     def _check_security(self):
         require_access(c.app, 'read')
 
-
     @expose('json:')
     def bin_counts(self, *args, **kw):
         bin_counts = []
@@ -1150,22 +1151,10 @@ class BinController(BaseController, AdminControllerMixin):
         return dict(bins=self.app.bins, count=count, app=self.app)
 
     @with_trailing_slash
-    @expose('jinja:forgetracker:templates/tracker/bin.html')
-    def bins(self):
-        count = len(self.app.bins)
-        return dict(bins=self.app.bins, count=count, app=self.app)
-
-    @with_trailing_slash
-    @expose('jinja:forgetracker:templates/tracker/new_bin.html')
-    def newbin(self, q=None, **kw):
-        c.bin_form = W.bin_form
-        return dict(q=q or '', bin=bin or '', modelname='Bin', page='New Bin', globals=self.app.globals)
-
-    @with_trailing_slash
     @h.vardec
     @expose('jinja:forgetracker:templates/tracker/bin.html')
     @require_post()
-    @validate(W.bin_form, error_handler=newbin)
+    @validate(W.bin_form, error_handler=index)
     def save_bin(self, **bin_form):
         """Update existing search bin or create a new one.
 
@@ -1204,15 +1193,6 @@ class BinController(BaseController, AdminControllerMixin):
         self.app.globals.invalidate_bin_counts()
         redirect('.')
 
-    @with_trailing_slash
-    @expose()
-    @require_post()
-    @validate(validators=dict(bin=V.Ming(TM.Bin)))
-    def delbin(self, bin=None):
-        require(lambda: bin.app_config_id == self.app.config._id)
-        bin.delete()
-        redirect(request.referer or '/')
-
     @without_trailing_slash
     @h.vardec
     @expose('jinja:forgetracker:templates/tracker/bin.html')