diff --git a/subunit2sql/db/models.py b/subunit2sql/db/models.py index d66ccd8..de2a71b 100644 --- a/subunit2sql/db/models.py +++ b/subunit2sql/db/models.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. +import datetime import uuid from oslo.db.sqlalchemy import models # noqa @@ -68,6 +69,8 @@ class Run(BASE, SubunitBase): passes = sa.Column(sa.Integer()) run_time = sa.Column(sa.Float()) artifacts = sa.Column(sa.Text()) + run_at = sa.Column(sa.DateTime, + default=datetime.datetime.utcnow) class TestRun(BASE, SubunitBase): diff --git a/subunit2sql/migrations/versions/28ac1ba9c3db_add_run_order_column.py b/subunit2sql/migrations/versions/28ac1ba9c3db_add_run_order_column.py new file mode 100644 index 0000000..b97cbba --- /dev/null +++ b/subunit2sql/migrations/versions/28ac1ba9c3db_add_run_order_column.py @@ -0,0 +1,36 @@ +# Copyright 2014 Hewlett-Packard Development Company, L.P. +# +# Licensed 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. + +"""Add order column + +Revision ID: 28ac1ba9c3db +Revises: 13d819bbb0ff +Create Date: 2014-08-02 21:54:55.634109 + +""" + +# revision identifiers, used by Alembic. +revision = '28ac1ba9c3db' +down_revision = '13d819bbb0ff' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.add_column('runs', sa.Column('run_at', sa.DateTime())) + + +def downgrade(): + op.drop_column('runs', 'run_order') diff --git a/subunit2sql/tests/migrations/test_migrations.py b/subunit2sql/tests/migrations/test_migrations.py index 95d3a10..1d5b87e 100644 --- a/subunit2sql/tests/migrations/test_migrations.py +++ b/subunit2sql/tests/migrations/test_migrations.py @@ -406,3 +406,40 @@ class TestWalkMigrations(base.TestCase): def _check_163fd5aa1380(self, engine, data): self.assertColumnExists(engine, 'tests', 'run_time') + + def _pre_upgrade_28ac1ba9c3db(self, engine): + runs = get_table(engine, 'runs') + data = [{'id': 'fake_run.id1', + 'skips': 0, + 'fails': 0, + 'passes': 1, + 'run_time': 1.0, + 'artifacts': 'fake_url'}, + {'id': 'fake_run.id2', + 'skips': 0, + 'fails': 0, + 'passes': 1, + 'run_time': 1.0, + 'artifacts': 'fake_url'}] + for run in data: + runs.insert().values(run).execute() + return data + + def _check_28ac1ba9c3db(self, engine, data): + self.assertColumnExists(engine, 'runs', 'run_at') + runs = get_table(engine, 'runs') + now = datetime.datetime.now().replace(microsecond=0) + time_data = {'id': 'fake_run_with_time.id1', + 'skips': 0, + 'fails': 0, + 'passes': 1, + 'run_time': 1.0, + 'artifacts': 'fake_url', + 'run_at': now} + runs.insert().values(time_data).execute() + runs = get_table(engine, 'runs') + result = runs.select().execute() + run_at = map(lambda x: (x['id'], x['run_at']), result) + for run in data: + self.assertIn((run['id'], None), run_at) + self.assertIn((time_data['id'], now), run_at)