MobileFirst 7.1 Direct Update feature - ibm-mobilefirst

When we use direct update feature, is there any way to know how many users actually got the update and how many are pending?

As of this moment we do not have this feature, however you could add in custom analytics in the custom direct update listener. It's important to note that if there's a direct update pending, customers cannot use the app without accepting the direct update.
In onFinish, you could send a custom analytics log similar to below (docs).
Then go into the analytics console and create a custom chart showing how many people successfully direct update such as over time. (docs).
var directUpdateCustomListener = {
onStart: function(totalSize){
//show custom progress dialog
},
onProgress: function(status,totalSize,completedSize){
//update custom progress dialog
},
onFinish: function(status){
if (status == 'SUCCESS'){
//show success message
//send custom analytics
WL.Analytics.log({directUpdate: "success"},"successful direct update");
WL.Analytics.send();
WL.Client.reloadApp();
}
else {
//show custom error message
//submitFailure must be called is case of error
wl_directUpdateChallengeHandler.submitFailure();
}
}
};

In one way of thinking, all of your users got the update...
Nobody can run the old version of the code, so if they're logged as an active user AFTER you submitted the release, then they have the update.
-Paul Horan-
IBM

Related

Playwright upload file on non-input element

So I'm currently trying to automate uploading a profile photo on an Electron App using Playwright and I'm running into issues with 'filechooser' event.
await windowA.click('data-testid');
const [fileChooser] = await Promise.all([
windowA.waitForEvent('filechooser'),
// windowA.locator('text=Edit').click(),
windowA.waitForTimeout(3000),
windowA.locator(selector).click(),
]);
The element used to upload a photo isn't an input type so I'm using
await fileChooser.setFiles(
[filepath],
{ timeout: 1000 }
);
The issue is trying to get playwright to select an image from the input dialog box that pops up and it just won't select any files. I've also been trying to get playwright to select an image in my fixtures folder, which is in a relative path to the test, but haven't had success in either case.
The error that Playwright is displaying is
page.waitForEvent: Timeout while waiting for event "filechooser"
waiting for event "filechooser"
Any know what the issue is?
My slippers told me that if you are using the window.showOpenFilePicker() to get a file from the user, you won't get the filechooser event at all. This is because internally, the showOpenFilePicker is not triggering an event as it is still a WIP.
More infos can be found there but I don't think there is a workaround for now
https://githubmemory.com/repo/microsoft/playwright/issues/8850
Pupetter has actually the same issue: https://github.com/puppeteer/puppeteer/issues/5210`
One fix would be to not use the showOpenFilePicker() at all, but instead rely on the <input> element to gather the file. This is a bit more cumbersome for the dev but is more supported and should trigger the 'filechooser' event.
Another fix could be to add a function you can override when running in test move for it to not even need to open the file chooser. Something like
getFileFromPicker() => {
if(!isRunningInTest) {
// do the showOpenFilePicker logic as usual in the app and the user will need to choose a file from it
} else {
// provide synchronously a buffer to use as file content, and so do not even show the picker to the testing user.
}

Event "formSubmission" doesn't trigger on Circuit SDK

Circuit client in my app subscribed to event 'formSubmission':
client.addEventListener('formSubmission', function (event)
Until last days it works fine, but now it doesn't trigger.
I tried to test it by creating a simple app that just send a form (just one button on it) as a reply to user's message and should log form submissions, but it doesn't go on this function.
client.addEventListener('formSubmission', function (event) {
var submittedValue = event.form.data[0].value;
console.log(`[CIRCUIT]: Form was submitted.`);
};
Any other events like 'itemAdded' or 'itemUpdated' work as they should
Yes, just confirmed this is a bug and is being worked on. Will post here when its resolved. Are you using the circuitsandbox.net or production?
Production systems have been updated and the formSubmission event is received again. circuitsandbox will be updated with this fix soon.

issue with authentication in teams bot: how to keep a tab forcibly open?

We have developed a bot based on Virtual Assistant Solution Accelerator beta 0.3.
The bot is consumed through Teams, and all in azure.
We are using other services through the bot: office365 and Yammer. The user authenticate through OAuthPrompt as per Virtual assistant code.
Until recently, everything was fine. But we discovered on Tuesday morning that we have an issue for users not already logged in.
In the process of authentication, when clicking on the login button in the oauthprompt card, it opens a new tab, connect the user and show magic code. But now, this tab is closing right after displaying the code, preventing the user to copying it into teams.
If we reopen the tab right after, the code is here and working.
We tested with chrome, Firefox and edge, same result. But on mobile the tab stays open. We tested both through teams app et teams web app.
My question now: is there a way for me to keep a tab open when it's open through a card in teams (action type is openUrl).
This is likely related to this issue, specifically in that your action type is openUrl when it should be Signin, now.
Were you using the middleware in order to get it to work initially? The middleware would look something like:
// hook up onSend pipeline
turnContext.OnSendActivities(async (ctx, activities, nextSend) =>
{
foreach (var activity in activities)
{
if (activity.ChannelId != "msteams") continue;
if (activity.Attachments == null) continue;
if (!activity.Attachments.Any()) continue;
if (activity.Attachments[0].ContentType != "application/vnd.microsoft.card.signin") continue;
if (!(activity.Attachments[0].Content is SigninCard card)) continue;
if (!(card.Buttons is CardAction[] buttons)) continue;
if (!buttons.Any()) continue;
// Modify button type to openUrl as signIn is not working in teams
buttons[0].Type = ActionTypes.OpenUrl;
}
// run full pipeline
return await nextSend().ConfigureAwait(false);
});
There was an update recently that made it so you no longer need the middleware. Instead, follow these steps:
Download the newest sample
Create your Teams Bot in the App Studio Manifest Editor
Under Domains and Permissions, ensure that token.botframework.com has been added as a valid domain.
Optionally, enable Web app Single Sign-On with your appId and https://token.botframework.com/.auth/web/redirect
Click Install and start talking to your bot
If you've done substantial work to your bot and don't want to use a fresh sample, update all of your packages to 4.4.4 and I believe you can just add this to the top of your OnTurnAsync():
if (turnContext?.Activity?.Type == ActivityTypes.Invoke && turnContext.Activity.ChannelId == "msteams")
await Dialog.Run(turnContext, ConversationState.CreateProperty<DialogState>(nameof(DialogState)), cancellationToken);
else
await base.OnTurnAsync(turnContext, cancellationToken);
If that doesn't work, you can try using this:
protected override async Task OnUnrecognizedActivityTypeAsync(ITurnContext turnContext, CancellationToken cancellationToken)
{
if (turnContext?.Activity.Type == ActivityTypes.Invoke)
{
await turnContext.SendActivityAsync(
new Activity()
{
Type = ActivityTypesEx.InvokeResponse,
Value = null
});
await Dialog.Run(turnContext, ConversationState.CreateProperty<DialogState>(nameof(DialogState)), cancellationToken);
}
}
The middleware made it so the cards in Teams use Action.OpenUrl (which no longer works) instead of Action.Signin (which is what every other channel uses).
Per #SylvainBarbot, you may also need to update your packages, as discussed in this issue

If-else in testcomplete

I have application "Application" , which have same autorization service as skype, QQ etc (You must log using yours login/password)
I need to test some functionality in settings of this application, so I`m using testcomplete :
I need tu run application
Go to settings
Change something
Save
And its quite simple. But if you are logged of, I need to reproduce such scenario:
run application
1.1. if logged of - log using (testlogin/testpassword)
Go to settings
Change something
Save
How I can reproduce such functionality in TestComplete?
I`m newbie with it so I need help :)
Thanks
Make your test check whether the login window is displayed. You can do this using one of the Wait* methods. If the login window is displayed then call a test routine/keyword test that will perform a login and then continue the general test flow.
...
var loginWindow = Sys.Process("Application").WaitWinFormsObject("loginDialog", 3000);
if (loginWindow.Exists) {
doLogin();
}
...
function doLogin()
{
// perform login
}
While your answer is totally right, I'd like to know if this is possible:
If the loginWindow does not exist, TC gives an error, is it possible to ignore this error and keep it out of the log besides locking the log or disabling it?
Like in Java or C#:
if(object.Exists)
do something;
else
do other thing;
this throws an error in TC and I don't want it to because I'm already checking for the existence of the object...
You cannot use a method on a object that is not there.
Workaround would be to first check for an object and then to use the Exists method like so..
if (object && object.Exists) {
// doSomething
} else {
// doSomethingElse
}

RavenDB Push Notifications: Actual document not included?

I've successfully implemented push notifications with RavenDB (see code below). I was expecting the actual document to be included with the change notification. That way, all the UI clients can display the information. However, it seems that only the Id and Etag properties are available for the changed document.
What am I supposed to do if I want the client to be able to display information about the document? Does the client now need to make a DB call to get the document based on the ID? It seems inefficient to have to make a DB call to get the information. But, is that what is supposed to happen?
documentStore.Changes()
.ForDocumentsStartingWith("LogMessages")
.Subscribe(change =>
{
if (change.Type == DocumentChangeTypes.Put)
{
// Fire event so consumers can display document info
// Uh oh, are change.Id and change.Etag all we have here?
DatabaseItemAdded(null, new EventArgs<string>(change.Id));
}
});
Yes, you need to call the db to get the new document.
The reason for that is that it would be expensive to send the document (which may be very big) if all you need is just the notification on the change).