/** * 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. */ /** * @fileoverview Contains the logic for calculating the data used for verifying * the results based on the current context of the run environment. (e.g. * the viewer, the owner, the container). More verifications will be done * for several known users. For unknown users, there will be limited or no * verification. */ function Context(viewer, owner, domain) { // Emulate OpenSocial isViewer/isOwner interface. this.viewer = viewer ? viewer : { isOwner: function() {return false;}, isViewer: function() {return true;} }; this.owner = owner ? owner : { isOwner: function() {return true;}, isViewer: function() {return false;} }; // Mode is: is testuser, is testfriend, is anonymous. this.__isOwner = owner && viewer && (owner.getDisplayName() == viewer.getDisplayName()); this.__isUnitTestUser = false; // Tom this.__isDevUnitTestUser = false; // Frank this.__isTestUserFriend = false; // Sam or Sandy this.__isUnknownUser = false; // Unknown viewer // Create the corresponding data instance, based on the domain. var data; var dataConstructor = Config.domainToDataContructor[domain]; if (dataConstructor) { data = new dataConstructor(); } else { data = (typeof TestData.CustomData == 'function') ? new TestData.CustomData() : new TestData.DefaultData(domain); } this.__data = data; this.viewerName = viewer ? viewer.getDisplayName() : 'viewerWithoutApp'; this.ownerName = owner ? owner.getDisplayName() : 'anonymousOwner'; // Set the expected viewer and owner for verification. for (var key in data.users) { if (this.viewerName == data.users[key]['getDisplayName']) { this.__expectedViewer = data.users[key]; this.__expectedViewer.isViewer = true; this.__expectedViewer.isOwner = this.__expectedViewer['getDisplayName'] == this.ownerName; } } if (!this.__expectedViewer) { this.__expectedViewer = data && data.users['testUserData'] ? data.users['testUserData'] : {}; } for (var key in data.users) { if (this.ownerName == data.users[key]['getDisplayName']) { this.__expectedOwner = data.users[key]; this.__expectedOwner.isOwner = true; this.__expectedOwner.isViewer = this.__expectedOwner['getDisplayName'] == this.viewerName; } } if (!this.__expectedOwner) { this.__expectedOwner = data && data.users['testUserData'] ? data.users['testUserData'] : {}; } // Set the isOwner flag for owner's and viewer's friends. var ownerFriends = this.__expectedOwner["__friends__"] || []; for (var i = 0; i < ownerFriends.length; i++) { if (ownerFriends[i]['getDisplayName'] == this.ownerName) { ownerFriends[i]['isOwner'] = true; } } var viewerFriends = this.__expectedViewer["__friends__"] || []; for (var i = 0; i < viewerFriends.length; i++) { if (viewerFriends[i]['getDisplayName'] == this.ownerName) { viewerFriends[i]['isOwner'] = true; } } }; // actual viewer Context.prototype.getViewer = function() { return this.viewer; }; // actual owner Context.prototype.getOwner = function() { return this.owner; }; Context.prototype.isNotAvailable = function(viewerOrOwner) { if (viewerOrOwner == Config.VIEWER) { return this.viewer ? false : true; } else if (viewerOrOwner == Config.OWNER) { return this.owner ? false : true; } else { return this.isViewerWithoutApp(); } }; /* * Returns a merge of data.users and data.fields to keep the interface * that the current tests are assuming. */ Context.prototype.getData = function() { var mergedData = {}; for (var user in this.__data.users) { mergedData[user] = this.__data.users[user]; } for (var field in this.__data.fields) { mergedData[field] = this.__data.fields[field]; } return mergedData; }; Context.prototype.getIsOwner = function() { return this.__isOwner; }; Context.prototype.getExpectedViewer = function() { return this.__expectedViewer; }; Context.prototype.getExpectedViewerFriends = function() { var friends = this.__expectedViewer ? this.__expectedViewer['__friends__'] : undefined; return friends; }; Context.prototype.getExpectedOwner = function() { return this.__expectedOwner; }; Context.prototype.getExpectedOwnerFriends = function() { var friends = this.__expectedOwner ? this.__expectedOwner['__friends__'] : undefined; return friends; }; Context.prototype.getEnvironment = function() { var envData = this.__data.environment; if (document && document.referrer) { if (document.referrer.indexOf('Profile') > 0) { envData.view = envData.profileView; } else if (document.referrer.indexOf('Application') > 0) { envData.view = envData.canvasView; } else { envData.view = envData.defaultView; } } return envData; } Context.prototype.isViewerWithoutApp = function() { // undefined or viewName matches return (!this.viewerName) || (this.viewerName == 'viewerWithoutApp'); } Context.prototype.getInfo = function() { var info = "Running tests as: Viewer='" + this.viewerName; info += "' , Owner='" + this.ownerName + "'"; // Add included and excluded tags info. if (Config.include != undefined && Config.include.length > 0) { info += '
Tags Included: ' + Config.include.toString(); } else { info += '
Tags Included: all'; } if (Config.exclude != undefined && Config.exclude.length > 0) { info += '
Tags Excluded: ' + Config.exclude.toString(); } else { info += '
Tags Excluded: none'; } return info; }; Context.prototype.getContainer = function() { return this.__data.container; }