[ 
https://issues.apache.org/jira/browse/CB-10399?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15209027#comment-15209027
 ] 

ASF GitHub Bot commented on CB-10399:
-------------------------------------

Github user nikhilkh commented on a diff in the pull request:

    
https://github.com/apache/cordova-plugin-contacts/pull/101#discussion_r57225303
  
    --- Diff: appium-tests/common/common.spec.js ---
    @@ -0,0 +1,321 @@
    +/*jshint node: true, jasmine: true, browser: true */
    +/*global ContactFindOptions, ContactName*/
    +
    +/*
    + *
    + * 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.
    + *
    +*/
    +
    +// these tests are meant to be executed by Cordova Medic Appium runner
    +// you can find it here: https://github.com/apache/cordova-medic/
    +// it is not necessary to do a full CI setup to run these tests, just run:
    +// node cordova-medic/medic/medic.js appium --platform android --plugins 
cordova-plugin-contacts
    +
    +'use strict';
    +
    +var wdHelper = global.WD_HELPER;
    +var screenshotHelper = global.SCREENSHOT_HELPER;
    +var contactsHelper = require('../helpers/contactsHelper');
    +
    +var MINUTE = 60 * 1000;
    +var PLATFORM = global.PLATFORM;
    +var UNORM = global.UNORM;
    +
    +describe('Contacts Android', function () {
    +    var driver;
    +    var webviewContext;
    +    var callbackCount = 0;
    +
    +    function getNextCallbackId() {
    +        return 'appium_callback_' + callbackCount++;
    +    }
    +
    +    function saveScreenshotAndFail(error) {
    +        fail(error);
    +        return screenshotHelper
    +            .saveScreenshot(driver)
    +            .quit()
    +            .then(function () {
    +                return getDriver();
    +            });
    +    }
    +
    +    function getDriver() {
    +        var getWebviewContext = function () {
    +            return driver
    +                .contexts()
    +                .then(function (contexts) {
    +                    var found = false;
    +                    // take the last webview context
    +                    for (var i = 0; i < contexts.length ; i++) {
    +                        if (contexts[i].indexOf('WEBVIEW') >= 0) {
    +                            webviewContext = contexts[i];
    +                            found = true;
    +                        }
    +                    }
    +                    if (!found) {
    +                        // no webview context, the app is still loading
    +                        return driver
    +                            .sleep(10000)
    +                            .then(getWebviewContext);
    +                    }
    +                });
    +        };
    +        driver = wdHelper.getDriver(PLATFORM);
    +        return getWebviewContext();
    +    }
    +
    +    function addContact(firstName, lastName) {
    +        var contactName = contactsHelper.getContactName(firstName, 
lastName);
    +        return driver
    +            .context(webviewContext)
    +            .setAsyncScriptTimeout(MINUTE)
    +            .executeAsync(function(contactname, callback) {
    +                navigator.contacts
    +                    .create({ 'displayName': contactname.formatted, 
'name': contactname, 'note': 'DeleteMe' })
    +                    .save(callback, callback);
    +            }, [contactName])
    +            .then(function(result) {
    +                if (result && result.hasOwnProperty('code')) {
    +                    throw result;
    +                }
    +                return result;
    +            });
    +    }
    +
    +    function pickContact(name) {
    +        var callbackId = getNextCallbackId();
    +        return driver
    +            .context(webviewContext)
    +            .execute(function (cbId) {
    +                var cbEl = document.createElement('div');
    +                cbEl.id = cbId;
    +                cbEl.style.display = 'none';
    +                navigator.contacts.pickContact(function (contact) {
    +                    cbEl.innerHTML = JSON.stringify(contact);
    +                    document.body.appendChild(cbEl);
    +                }, function (err) {
    +                    cbEl.innerHTML = 'ERROR: ' + err;
    +                    document.body.appendChild(cbEl);
    +                });
    +            }, [callbackId])
    +            .context('NATIVE_APP')
    +            .then(function () {
    +                switch (PLATFORM) {
    +                    case 'ios':
    +                        return 
driver.waitForElementByXPath(UNORM.nfd('//UIAStaticText[@label="' + name + 
'"]'), MINUTE);
    +                    case 'android':
    +                        return 
driver.waitForElementByXPath('//android.widget.TextView[@text="' + name + '"]', 
MINUTE);
    +                }
    +            })
    +            .click()
    +            .context(webviewContext)
    +            .waitForElementById(callbackId)
    +            .getAttribute('innerHTML')
    +            .then(function (result) {
    +                if (result && typeof result === 'string' && 
result.indexOf('ERROR: ') === 0) {
    +                    throw result.slice(7);
    +                }
    +                return JSON.parse(result);
    +            });
    +    }
    +
    +    function renameContact(oldName, newGivenName, newFamilyName) {
    +        return driver
    +            .context(webviewContext)
    +            .setAsyncScriptTimeout(MINUTE)
    +            .executeAsync(function (oldname, newgivenname, newfamilyname, 
callback) {
    +                var obj = new ContactFindOptions();
    +                obj.filter = oldname;
    +                obj.multiple = false;
    +
    +                navigator.contacts.find(['displayName', 'name'], 
function(contacts) {
    +                    if (contacts.length === 0) {
    +                        return;
    +                    }
    +                    var contact = contacts[0];
    +                    contact.displayName = newgivenname + ' ' + 
newfamilyname;
    +                    var name = new ContactName();
    +                    name.givenName = newgivenname;
    +                    name.familyName = newfamilyname;
    +                    contact.name = name;
    +                    contact.save(callback, callback);
    +                }, callback, obj);
    +            }, [oldName, newGivenName, newFamilyName])
    +            .then(function(result) {
    +                if (result && result.hasOwnProperty('code')) {
    +                    throw result;
    +                }
    +                return result;
    +            });
    +    }
    +
    +    function removeTestContacts() {
    +        return driver
    +            .context(webviewContext)
    +            .setAsyncScriptTimeout(MINUTE)
    +            .executeAsync(function (callback) {
    +                var obj = new ContactFindOptions();
    +                obj.filter = 'DeleteMe';
    +                obj.multiple = true;
    +                navigator.contacts.find(['note'], function(contacts) {
    +                    var removes = [];
    +                    contacts.forEach(function(contact) {
    +                        removes.push(contact);
    +                    });
    +                    if (removes.length === 0) {
    +                        return;
    +                    }
    +
    +                   var nextToRemove;
    +                   if (removes.length > 0) {
    +                        nextToRemove = removes.shift();
    +                    }
    +
    +                    function removeNext(item) {
    +                        if (typeof item === 'undefined') {
    +                            callback();
    +                            return;
    +                        }
    +
    +                        if (removes.length > 0) {
    +                            nextToRemove = removes.shift();
    +                        } else {
    +                            nextToRemove = undefined;
    +                        }
    +
    +                        item.remove(function removeSucceeded() {
    +                            removeNext(nextToRemove);
    +                        }, function removeFailed() {
    +                            removeNext(nextToRemove);
    +                        });
    +                    }
    +                    removeNext(nextToRemove);
    +                }, callback, obj);
    +            }, [])
    +            .then(function(result) {
    +                if (typeof result !== 'undefined') {
    +                    throw result;
    +                }
    +            });
    +    }
    +
    +    it('contacts.ui.util configuring driver and starting a session', 
function (done) {
    +        getDriver()
    +            .fail(fail)
    +            .finally(done);
    +    }, 5 * MINUTE);
    +
    +    describe('Picking contacts', function () {
    +        afterEach(function (done) {
    +            removeTestContacts()
    +                .finally(done);
    +        }, MINUTE);
    +
    +        it('contacts.ui.spec.1 Pick a contact', function (done) {
    +            driver
    +                .then(function () {
    +                    return addContact('Test', 'Contact');
    +                })
    +                .then(function () {
    +                    return pickContact('Test Contact');
    +                })
    +                .then(function (contact) {
    +                    expect(contact.name.givenName).toBe('Test');
    +                    expect(contact.name.familyName).toBe('Contact');
    +                })
    +                .fail(saveScreenshotAndFail)
    +                .finally(done);
    +        }, 5 * MINUTE);
    +
    +        it('contacts.ui.spec.2 Update an existing contact', function 
(done) {
    +            driver
    +                .then(function () {
    +                    return addContact('Dooney', 'Evans');
    +                })
    +                .then(function () {
    +                    return renameContact('Dooney Evans', 'Urist', 
'McContact');
    +                })
    +                .then(function (contact) {
    +                    expect(contact.name.givenName).toBe('Urist');
    +                    expect(contact.name.familyName).toBe('McContact');
    +                })
    +                .then(function () {
    +                    return pickContact('Urist McContact');
    +                })
    +                .then(function (contact) {
    +                    expect(contact.name.givenName).toBe('Urist');
    +                    expect(contact.name.familyName).toBe('McContact');
    +                })
    +                .fail(saveScreenshotAndFail)
    +                .finally(done);
    --- End diff --
    
    You want to end the promise chain with .done() - otherwise failures can get 
lost.


> Implement Appium tests for Contacts plugin
> ------------------------------------------
>
>                 Key: CB-10399
>                 URL: https://issues.apache.org/jira/browse/CB-10399
>             Project: Apache Cordova
>          Issue Type: Task
>          Components: Medic, Plugin Contacts
>            Reporter: Alexander Sorokin
>            Assignee: Alexander Sorokin
>




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to