def test_collect_query_parameters(self):

        json = {
            "find":
            ["id", "title", "content", {
                "comments": ["id", "comment"]
            }],
            "where": {
                "id": 13
            }
        }

        initial_state = Immutable(data=None, errors=[])
        process = compose_list([
            change("json", json),
            change("type", Article), collect_query_parameters
        ])

        final_state = process(initial_state)

        qp = final_state.query_parameters

        self.assertEquals(qp["properties"], [
            Article.id, Article.title, Article.content, Comment.id,
            Comment.comment
        ])
        self.assertEquals(qp["joins"], [Article.comments])
        self.assertEquals(str(qp["conditions"][0]), str(Article.id == 13))
        self.assertEquals(qp["first_property"], Article.id)
    def get_transform_from_json(self, json):
        initial_state = Immutable(data=None, errors=[])
        process = compose_list([
            change("json", json),
            change("data", Article()),
            change("type", Article), transform_from_json
        ])

        return process(initial_state)
    def test_to_json(self, to_json):
        json = {"title": "A title", "content": "Some content"}
        initial_state = Immutable(data=None, errors=[])
        process = compose_list([change("data", json), to_json])
        final_state = process(initial_state)

        json_final = loads(final_state)

        #assert the object contains the values
        self.compareRecursively({"data": json}, json_final, [])
    def get_database_object_for(self, json, session):
        initial_state = Immutable(data=None, errors=[])
        process = compose_list([
            change("json", json),
            change("session", session),
            change("type", Article),
            get_database_object
        ])


        return process(initial_state)
    def test_transform_to_json_article(self):
        initial_state = Immutable(data=None, errors=[])
        process = compose_list([
            change("data", Article(title="title", content="content")),
            change("type", Article), transform_to_json
        ])
        final_state = process(initial_state)

        #assert the object contains the values
        json = value("data")(final_state)

        self.assertTrue(json.has_key("id"))
        self.assertEquals("title", json["title"])
        self.assertEquals("content", json["content"])
def save(json, session):

    initial_state = Immutable(data=None, errors=[])

    process = compose_list([
        change("json", json),
        change("session", session),
        change("type", Article), get_database_object, transform_from_json,
        save_database_object, transform_to_json, to_json
    ])

    final_state = process(initial_state)

    return final_state
    def test_run_queries(self):
        #given an article in the database

        session = Session()
        new_article = Article(title="Title",
                              content="Content",
                              comments=[
                                  Comment(comment="my first comment"),
                                  Comment(comment="my second comment")
                              ])
        session.add(new_article)
        session.commit()

        id = new_article.id
        session.close()

        session = Session()
        queries = {
            "query_ids":
            session.query(Article.id).outerjoin(Article.comments).filter(
                Article.id == id).group_by(Article.id),
            "query":
            session.query(Article.id, Article.title, Article.content,
                          Comment.id, Comment.comment).outerjoin(
                              Article.comments).group_by(
                                  Article.id, Article.title, Article.content,
                                  Comment.id, Comment.comment),
            "first_property":
            Article.id
        }

        initial_state = Immutable(data=None, errors=[])
        process = compose_list([
            change("queries", queries),
            change("type", Article),
            change("session", session), run_queries
        ])

        final_state = process(initial_state)

        results = final_state.data

        self.assertEquals(results[0][0], id)
        self.assertEquals(results[0][1], "Title")
        self.assertEquals(results[0][2], "Content")
        self.assertEquals(results[0][4], "my first comment")
        self.assertEquals(results[1][0], id)
        self.assertEquals(results[1][1], "Title")
        self.assertEquals(results[1][2], "Content")
        self.assertEquals(results[1][4], "my second comment")
def query(json, session):
    initial_state = Immutable(data=None, errors=[])

    process = compose_list([
        change("json", json),
        change("session", session),
        change("type", Article), collect_query_parameters, generate_queries,
        run_queries, transform_results, to_json
    ])

    # transform("data", "data"),

    final_state = process(initial_state)

    return final_state
    def test_save_database_object(self):
        initial_state = Immutable(data=None, errors=[])
        title = "Saved "+str(random())
        process = compose_list([
            change("data", Article(title=title, content="Added content")),
            change("session", Session()),
            save_database_object
        ])

        final_state =  process(initial_state)

        # assert it exists in the database
        saved_object = Session().query(Article).filter(Article.title==title).first()
        self.assertEquals(title, saved_object.title)
        self.assertEquals("Added content", saved_object.content)
    def test_transform_results(self):
        results = [(1, "my title", "my content", 10, "my first comment"),
                   (1, "my title", "my content", 11, "my second comment")]

        initial_state = Immutable(data=None, errors=[])
        process = compose_list([
            change(
                "json", {
                    "find": [
                        "id", "title", "content", {
                            "comments": ["id", "comment"]
                        }
                    ]
                }),
            change("data", results), transform_results
        ])
        final_state = process(initial_state)

        expected_json = {
            1: {
                "id": 1,
                "title": "my title",
                "content": "my content",
                "comments": {
                    10: {
                        "id": 10,
                        "comment": "my first comment"
                    },
                    11: {
                        "id": 11,
                        "comment": "my second comment"
                    }
                }
            }
        }

        self.compareRecursively(expected_json, final_state.data, [])
    def test_generate_queries(self):
        qp = {
            "properties": [
                Article.id, Article.title, Article.content, Comment.id,
                Comment.comment
            ],
            "joins": [Article.comments],
            "conditions": [Article.id == 13]
        }
        session = Session()

        initial_state = Immutable(data=None, errors=[])
        process = compose_list([
            change("query_parameters", qp),
            change("type", Article),
            change("session", session), generate_queries
        ])

        final_state = process(initial_state)

        queries = final_state.queries

        self.assertEquals(
            str(queries["query_ids"]),
            str(
                session.query(Article.id).outerjoin(Article.comments).filter(
                    Article.id == 13).group_by(Article.id)))
        self.assertEquals(
            str(queries["query"]),
            str(
                session.query(
                    Article.id, Article.title, Article.content, Comment.id,
                    Comment.comment).outerjoin(Article.comments).group_by(
                        Article.id, Article.title, Article.content, Comment.id,
                        Comment.comment)))
        self.assertEquals(queries["first_property"], Article.id)