/*
 *  Copyright 2011 Research In Motion Limited.
 * 
 * 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.
 */
describe("webworks Task", function () {

    var Task = require('ripple/platform/webworks/2.0.0/server/Task'),
        TaskClient = require('ripple/platform/webworks/2.0.0/client/Task'),
        Recurrence = require('ripple/platform/webworks/2.0.0/client/Recurrence'),
        Reminder = require('ripple/platform/webworks/2.0.0/client/Reminder'),
        webworks = require('ripple/platform/webworks/2.0.0/server'),
        utils = require('ripple/utils'),
        db = require('ripple/db'),
        select = require('ripple/platform/webworks/2.0.0/select'),
        FilterExpression = require('ripple/platform/webworks/2.0.0/client/FilterExpression'),
        spec = require('ripple/platform/webworks/2.0.0/spec'),
        transport = require('ripple/platform/webworks/2.0.0/client/transport');

    describe("server index", function () {
        it("exposes the module", function () {
            expect(webworks.blackberry.pim.Task).toEqual(Task);
        });
    });

    describe("spec index", function () {
        it("includes module according to proper object structure", function () {
            expect(spec.objects.blackberry.children.pim.children.Task.path)
                .toEqual("webworks/2.0.0/client/Task");
        });
    });

    describe("client", function () {
        describe("constructor", function () {
            describe("priority", function () {
                it("defaults to normal", function () {
                    expect(new TaskClient().priority).toEqual(TaskClient.PRIORITY_NORMAL);
                });
            });

            describe("status", function () {
                it("defaults to not started", function () {
                    expect(new TaskClient().status).toEqual(TaskClient.NOT_STARTED);
                });
            });

            describe("save", function () {
                it("generates a uuid when saved", function () {
                    spyOn(Math, "uuid").andReturn("234");
                    spyOn(transport, "call");

                    var task = new TaskClient();
                    task.save();

                    expect(task.uid).toEqual("234");
                    expect(Math.uuid).toHaveBeenCalledWith(null, 16);
                });

                it("calls the transport with id and properties", function () {
                    var task = new TaskClient();

                    spyOn(Math, "uuid").andReturn("42");
                    spyOn(transport, "call");

                    task.save();

                    expect(transport.call).toHaveBeenCalledWith("blackberry/pim/Task/save", {
                        post: {
                            task: task
                        }
                    });
                });

            });

            describe("remove", function () {
                it("calls the transport with id and properties", function () {
                    var task = new TaskClient();
                    spyOn(transport, "call");
                    task.uid = "id";
                    task.remove();
                    expect(transport.call).toHaveBeenCalledWith("blackberry/pim/Task/remove", {
                        get: {
                            id: "id"
                        }
                    });
                });

                it("throws exception when called before save", function () {
                    var task = new TaskClient();
                    spyOn(transport, "call");
                    expect(function () {
                        task.remove();
                    }).toThrow();
                });
            });
        });

        describe("module", function () {
            describe("find", function () {
                it("calls the transport with proper args", function () {
                    var tasks = [];
                    spyOn(transport, "call").andReturn(tasks);
                    expect(TaskClient.find(1, 2, 3, 4)).toEqual(tasks);
                    expect(transport.call).toHaveBeenCalledWith("blackberry/pim/Task/find", {
                        post: {
                            filter: 1,
                            orderBy: 2,
                            maxReturn: 3,
                            isAscending: 4
                        }
                    });
                });

                it("returns an array of massaged Task objects", function () {
                    var task = new TaskClient(),
                        tasks;

                    task.uid = "id";
                    task.note = "value";
                    task.due = new Date();
                    task.recurrence = new Recurrence();
                    task.recurrence.end = new Date();
                    task.reminder = new Reminder();
                    task.reminder.date = new Date();

                    spyOn(transport, "call").andReturn([JSON.parse(JSON.stringify(task))]);

                    tasks = TaskClient.find();

                    expect(tasks.length).toEqual(1);
                    expect(tasks[0].uid).toEqual(task.uid);
                    expect(tasks[0].note).toEqual(task.note);
                    expect(tasks[0].due).toEqual(task.due);
                    expect(tasks[0].recurrence.end).toEqual(task.recurrence.end);
                    expect(tasks[0].reminder.date).toEqual(task.reminder.date);
                });
            });
        });
    });

    describe("server module", function () {
        describe("find", function () {
            it("calls select module with filter expression", function () {
                var filter = new FilterExpression(),
                    chain = {
                        where: jasmine.createSpy()
                    };
                spyOn(select, "from").andReturn(chain);
                Task.find({}, {filter: filter});
                expect(chain.where).toHaveBeenCalledWith(filter);
            });

            it("returns unfiltered list of tasks", function () {
                var task = {
                        uid: "id",
                        prop: "value"
                    },
                    tasks = {
                        "id": task
                    };

                spyOn(select, "from").andReturn({
                    where: jasmine.createSpy().andReturn([task])
                });
                spyOn(db, "saveObject");
                spyOn(db, "retrieveObject").andReturn(tasks);

                expect(Task.find({}, {}).data).toEqual([task]);
            });

            it("passes maxReturn", function () {
                var chain = {
                    where: jasmine.createSpy(),
                    max: jasmine.createSpy().andReturn(chain)
                };
                spyOn(select, "from").andReturn(chain);
                Task.find({}, {filter: new FilterExpression(), maxReturn: 2});
                expect(chain.max).toHaveBeenCalledWith(2);
            });

            it("passes orderBy", function () {
                var chain = {
                    where: jasmine.createSpy(),
                    orderBy: jasmine.createSpy().andReturn(chain)
                };
                spyOn(select, "from").andReturn(chain);
                Task.find({}, {filter: new FilterExpression(), orderBy: "orderByProp"});
                expect(chain.orderBy).toHaveBeenCalledWith("orderByProp", "asc");
            });

            it("passes desc when not isAscending", function () {
                var chain = {
                    where: jasmine.createSpy(),
                    orderBy: jasmine.createSpy().andReturn(chain)
                };
                spyOn(select, "from").andReturn(chain);
                Task.find({}, {filter: new FilterExpression(), orderBy: "foo", isAscending: false});
                expect(chain.orderBy.mostRecentCall.args[1]).toEqual("desc");
            });

            it("passes asc when isAscending", function () {
                var chain = {
                    where: jasmine.createSpy(),
                    orderBy: jasmine.createSpy().andReturn(chain)
                };
                spyOn(select, "from").andReturn(chain);
                Task.find({}, {filter: new FilterExpression(), orderBy: "foo", isAscending: true});
                expect(chain.orderBy.mostRecentCall.args[1]).toEqual("asc");
            });
        });

        describe("save", function () {
            it("persists a new task", function () {
                var tasks = {},
                    task = {
                        uid: "1234",
                        prop: "value"
                    };

                spyOn(db, "saveObject");
                spyOn(db, "retrieveObject").andReturn(tasks);
                Task.save({}, {task: task});

                expect(tasks).toEqual({
                    "1234": task
                });
                expect(db.saveObject).toHaveBeenCalledWith("blackberry-pim-task", tasks);
            });

            it("mixes into an existing task", function () {
                var task = {
                        "prop": "value",
                        "uid": "456",
                        "1": "2"
                    },
                    tasks = {
                        "456": {
                            "uid": "456",
                            "1": "3"
                        }
                    };

                spyOn(db, "saveObject");
                spyOn(db, "retrieveObject").andReturn(tasks);
                Task.save({}, {task: task});

                expect(tasks).toEqual({
                    "456": task
                });
                expect(db.saveObject).toHaveBeenCalledWith("blackberry-pim-task", tasks);
            });
        });

        describe("remove", function () {
            it("can remove a task", function () {
                var task = {
                        uid: "1234",
                        prop: "value"
                    },
                    tasks = {
                        "1234": task
                    };

                spyOn(db, "saveObject");
                spyOn(db, "retrieveObject").andReturn(tasks);

                Task.remove({id: "1234"}, {});

                expect(tasks).toEqual({});
                expect(db.saveObject).toHaveBeenCalledWith("blackberry-pim-task", tasks);
            });
        });
    });

});
