#104 Make the list of allowed outcomes configurable (polished version)
Closed 7 years ago by jskladan. Opened 7 years ago by jskladan.

@@ -0,0 +1,27 @@ 

+ """Change outcome from enum to string.

+ 

+ Revision ID: cd581d0e83df

+ Revises: 4dbe714897fe

+ Create Date: 2018-03-28 20:47:27.338605

+ 

+ """

+ 

+ # revision identifiers, used by Alembic.

+ revision = 'cd581d0e83df'

+ down_revision = '4dbe714897fe'

+ branch_labels = None

+ depends_on = None

+ 

+ from alembic import op

+ import sqlalchemy as sa

+ 

+ 

+ def upgrade():

+     op.alter_column('result', 'outcome', type_=sa.String(32))

+     op.create_index('result_idx_outcome', 'result', [

+                     'outcome'], unique=False, postgresql_ops={'outcome': 'text_pattern_ops'})

+ 

+ 

+ def downgrade():

+     op.execute("ALTER TABLE result ALTER COLUMN outcome TYPE resultoutcome USING outcome::resultoutcome;")

+     op.drop_index('result_idx_outcome', table_name='result')

file modified
+4
@@ -46,6 +46,9 @@ 

          'create_testcase': [],

          }

  

+     # Extend the list of allowed outcomes.

+     ADDITIONAL_RESULT_OUTCOMES = ()

+ 

      # Supported values: "oidc"

      AUTH_MODULE = None

  
@@ -110,3 +113,4 @@ 

      TRAP_BAD_REQUEST_ERRORS = True

      FEDMENU_URL = 'https://apps.stg.fedoraproject.org/fedmenu'

      FEDMENU_DATA_URL = 'https://apps.stg.fedoraproject.org/js/data.js'

+     ADDITIONAL_RESULT_OUTCOMES = ('AMAZING',)

@@ -683,5 +683,6 @@ 

                      "documentation": "http://docs.resultsdb.apiary.io/",

                      "jobs": url_for('.get_jobs', _external=True),

                      "results": url_for('.get_results', _external=True),

-                     "testcases": url_for('.get_testcases', _external=True)

+                     "testcases": url_for('.get_testcases', _external=True),

+                     "outcomes": RESULT_OUTCOME,

                      }), 300

@@ -779,5 +779,6 @@ 

                      "documentation": "http://docs.resultsdb20.apiary.io/",

                      "groups": url_for('.get_groups', _external=True),

                      "results": url_for('.get_results', _external=True),

-                     "testcases": url_for('.get_testcases', _external=True)

+                     "testcases": url_for('.get_testcases', _external=True),

+                     "outcomes": RESULT_OUTCOME,

                      }), 300

file modified
+7 -4
@@ -20,14 +20,14 @@ 

  import datetime

  import uuid as lib_uuid

  

- from resultsdb import db

+ from resultsdb import db, app

  from resultsdb.serializers import DBSerialize

  

  

  __all__ = ['Testcase', 'Group', 'Result', 'ResultData', 'GroupsToResults', 'RESULT_OUTCOME']

  

- 

- RESULT_OUTCOME = ('PASSED', 'INFO', 'FAILED', 'NEEDS_INSPECTION')

+ PRESET_OUTCOMES = ('PASSED', 'INFO', 'FAILED', 'NEEDS_INSPECTION')

+ RESULT_OUTCOME = PRESET_OUTCOMES + app.config.get('ADDITIONAL_RESULT_OUTCOMES', [])

  JOB_STATUS = []

  

  
@@ -95,7 +95,7 @@ 

      testcase_name = db.Column(db.Text, db.ForeignKey('testcase.name'))

  

      submit_time = db.Column(db.DateTime, default=datetime.datetime.utcnow)

-     outcome = db.Column(db.Enum(*RESULT_OUTCOME, name='resultoutcome'))

+     outcome = db.Column(db.String(32))

      note = db.Column(db.Text)

      ref_url = db.Column(db.Text)

  
@@ -106,6 +106,9 @@ 

          db.Index('result_fk_testcase_name', 'testcase_name',

                   postgresql_ops={'testcase_name': 'text_pattern_ops'}),

          db.Index('result_submit_time', 'submit_time'),

+         db.Index('result_idx_outcome', 'outcome',

+                  postgresql_ops={'outcome': 'text_pattern_ops'},

+                  ),

      )

  

      def __init__(self, testcase, outcome, groups=None, ref_url=None, note=None):

@@ -429,6 +429,17 @@ 

          assert r.status_code == 201

          assert data == self.ref_result

  

+     def test_create_result_custom_outcome(self):

+         self.test_create_group()

+         self.test_create_testcase()

+         ref_result = copy.deepcopy(self.ref_result)

+         ref_result['outcome'] = 'AMAZING'

+ 

+         r, data = self.helper_create_result(outcome='AMAZING')

+ 

+         assert r.status_code == 201

+         assert data == ref_result

+ 

      def test_create_result_missing_data(self):

          ref_data = json.dumps({'outcome': 'FAKEOUTCOME'})

          r = self.app.post('/api/v2.0/results', data=ref_data, content_type='application/json')
@@ -853,3 +864,9 @@ 

          assert plugin.history[0]['groups'] == [self.ref_group_uuid]

          assert plugin.history[0]['note'] == self.ref_result_note

          assert plugin.history[0]['testcase']['name'] == self.ref_testcase_name

+ 

+     def test_get_outcomes_on_landing_page(self):

+         r = self.app.get('/api/v2.0/')

+         data = json.loads(r.data)

+         assert r.status_code == 300

+         assert data['outcomes'] == ['PASSED', 'INFO', 'FAILED', 'NEEDS_INSPECTION', 'AMAZING']