/// <summary>
        /// For a given google account check for a spreasheet file existence and return the content from that spreadsheet
        /// </summary>
        /// <param name="authorizationTokenId"></param>
        /// <param name="spreadsheetName"></param>
        /// <returns></returns>
        public async Task <StandardTableDataCM> GetSpreadsheetIfExist(Guid authorizationTokenId, string spreadsheetName)
        {
            var defaultGoogleAuthToken = GetGoogleAuthToken(authorizationTokenId);

            var googleSheetApi = new GoogleSheet(new GoogleIntegration(ObjectFactory.GetInstance <IRestfulServiceClient>()), new GoogleDrive());
            var googleSheets   = await googleSheetApi.GetSpreadsheets(defaultGoogleAuthToken);

            Assert.IsNotNull(googleSheets.FirstOrDefault(x => x.Value == spreadsheetName), "Selected spreadsheet was not found into existing google files.");
            var spreadSheeturl = googleSheets.FirstOrDefault(x => x.Value == spreadsheetName).Key;

            var worksheets = await googleSheetApi.GetWorksheets(spreadSheeturl, defaultGoogleAuthToken);

            Assert.IsNotNull(worksheets.FirstOrDefault(x => x.Value == "Sheet1"), "Worksheet was not found into google excel file.");
            var worksheetUri = worksheets.FirstOrDefault(x => x.Value == "Sheet1").Key;
            var dataRows     = (await googleSheetApi.GetData(spreadSheeturl, worksheetUri, defaultGoogleAuthToken)).ToList();

            var hasHeaderRow = false;

            //Adding header row if possible
            if (dataRows.Count > 0)
            {
                dataRows.Insert(0, new TableRowDTO {
                    Row = dataRows.First().Row.Select(x => new TableCellDTO {
                        Cell = new KeyValueDTO(x.Cell.Key, x.Cell.Key)
                    }).ToList()
                });
                hasHeaderRow = true;
            }

            return(new StandardTableDataCM {
                Table = dataRows, FirstRowHeaders = hasHeaderRow
            });
        }
        public async Task GoogleIntoGoogleEndToEnd()
        {
            var googleAuthTokenId      = await new Fr8.Testing.Integration.Tools.Terminals.IntegrationTestTools_terminalGoogle(this).ExtractGoogleDefaultToken();
            var defaultGoogleAuthToken = GetGoogleAuthToken(googleAuthTokenId);

            //create a new plan
            var googleSheetApi             = new GoogleSheet(new GoogleIntegration(ObjectFactory.GetInstance <IRestfulServiceClient>()), new GoogleDrive());
            var sourceSpreadsheetUri       = string.Empty;
            var destinationSpreadsheetUri  = string.Empty;
            var sourceSpreadsheetName      = Guid.NewGuid().ToString();
            var destinationSpreadsheetName = Guid.NewGuid().ToString();

            try
            {
                //Save test data into test spreadsheet
                sourceSpreadsheetUri = await googleSheetApi.CreateSpreadsheet(sourceSpreadsheetName, defaultGoogleAuthToken);

                var sourceWorksheetUri = (await googleSheetApi.GetWorksheets(sourceSpreadsheetUri, defaultGoogleAuthToken)).Select(x => x.Key).First();
                await googleSheetApi.WriteData(sourceSpreadsheetUri, sourceWorksheetUri, GetTestSpreadsheetContent(), defaultGoogleAuthToken);

                var thePlan = await _plansHelper.CreateNewPlan();

                //Configure Get_Google_Sheet_Data activity to read data from this test spreadsheet
                await _googleActivityConfigurator.AddAndConfigureGetFromGoogleSheet(thePlan, 1, sourceSpreadsheetName, true);

                //Configure Build_Message activity to build message based on the data from this spreadsheet
                await _fr8ActivityConfigurator.AddAndConfigureBuildMessage(thePlan, 2, "message", "Email - [email], subject - [subject], body - [body]");

                //Configure Save_To_Google activity to save this message into new test spreadsheet
                destinationSpreadsheetUri = await googleSheetApi.CreateSpreadsheet(destinationSpreadsheetName, defaultGoogleAuthToken);

                await _googleActivityConfigurator.AddAndConfigureSaveToGoogleSheet(thePlan, 3, "Standard Payload Data", Build_Message_v1.RuntimeCrateLabel, destinationSpreadsheetName);

                //run the plan
                await _plansHelper.RunPlan(thePlan.Id);

                var googleSheets = await googleSheetApi.GetSpreadsheets(defaultGoogleAuthToken);

                Assert.IsNotNull(googleSheets.FirstOrDefault(x => x.Value == destinationSpreadsheetName), "New created spreadsheet was not found into existing google files.");
                var spreadSheeturl = googleSheets.FirstOrDefault(x => x.Value == destinationSpreadsheetName).Key;

                //Checking that new test spreadsheet contains the same message that was generated
                var worksheets = await googleSheetApi.GetWorksheets(spreadSheeturl, defaultGoogleAuthToken);

                Assert.IsNotNull(worksheets.FirstOrDefault(x => x.Value == "Sheet1"), "Worksheet was not found into newly created google excel file.");
                var worksheetUri = worksheets.FirstOrDefault(x => x.Value == "Sheet1").Key;
                var dataRows     = (await googleSheetApi.GetData(spreadSheeturl, worksheetUri, defaultGoogleAuthToken)).ToArray();

                Assert.AreEqual(1, dataRows.Length, "Only one data row is expected to be in crated spreadsheet");
                var storedData = dataRows[0].Row[0].Cell;
                Assert.AreEqual("message", storedData.Key, "Saved message header doesn't match the expected data");
                Assert.AreEqual("Email - [email protected], subject - Fake Subject, body - Fake Body", storedData.Value, "Saved message body doesn't match the expected data");
            }
            finally
            {
                if (!string.IsNullOrEmpty(sourceSpreadsheetUri))
                {
                    await googleSheetApi.DeleteSpreadSheet(sourceSpreadsheetUri, defaultGoogleAuthToken);
                }
                if (!string.IsNullOrEmpty(destinationSpreadsheetUri))
                {
                    await googleSheetApi.DeleteSpreadSheet(destinationSpreadsheetUri, defaultGoogleAuthToken);
                }
            }
        }