예제 #1
1
    public Task TestFileSave() {
      var response = new FileState {
        Name = "newBekti.png",
        Url = new Uri("https://www.parse.com/newBekti.png"),
        MimeType = "image/png"
      };
      var mockController = new Mock<IParseFileController>();
      mockController.Setup(obj => obj.SaveAsync(It.IsAny<FileState>(),
          It.IsAny<Stream>(),
          It.IsAny<string>(),
          It.IsAny<IProgress<ParseUploadProgressEventArgs>>(),
          It.IsAny<CancellationToken>())).Returns(Task.FromResult(response));
      var mockCurrentUserController = new Mock<IParseCurrentUserController>();
      ParseCorePlugins.Instance.FileController = mockController.Object;
      ParseCorePlugins.Instance.CurrentUserController = mockCurrentUserController.Object;

      ParseFile file = new ParseFile("bekti.jpeg", new MemoryStream(), "image/jpeg");
      Assert.AreEqual("bekti.jpeg", file.Name);
      Assert.AreEqual("image/jpeg", file.MimeType);
      Assert.True(file.IsDirty);

      return file.SaveAsync().ContinueWith(t => {
        Assert.False(t.IsFaulted);
        Assert.AreEqual("newBekti.png", file.Name);
        Assert.AreEqual("image/png", file.MimeType);
        Assert.AreEqual("https://www.parse.com/newBekti.png", file.Url.AbsoluteUri);
        Assert.False(file.IsDirty);
      });
    }
예제 #2
0
 /// <summary>
 /// Creates a new file from a stream and a name.
 /// </summary>
 /// <param name="name">The file's name, ideally with an extension. The file name
 /// must begin with an alphanumeric character, and consist of alphanumeric
 /// characters, periods, spaces, underscores, or dashes.</param>
 /// <param name="data">The file's data.</param>
 /// <param name="mimeType">To specify the content-type used when uploading the
 /// file, provide this parameter.</param>
 public ParseFile(string name, Stream data, string mimeType = null) {
   state = new FileState {
     Name = name,
     MimeType = mimeType
   };
   this.dataStream = data;
 }
예제 #3
0
    public void TestSecureUrl() {
      Uri unsecureUri = new Uri("http://files.parsetfss.com/yolo.txt");
      Uri secureUri = new Uri("https://files.parsetfss.com/yolo.txt");
      Uri randomUri = new Uri("http://random.server.local/file.foo");

      FileState state = new FileState {
        Name = "A",
        Url = unsecureUri,
        MimeType = null
      };

      Assert.AreEqual(unsecureUri, state.Url);
      Assert.AreEqual(secureUri, state.SecureUrl);

      // Make sure the proper port was given back.
      Assert.AreEqual(443, state.SecureUrl.Port);

      state = new FileState {
        Name = "B",
        Url = randomUri,
        MimeType = null
      };

      Assert.AreEqual(randomUri, state.Url);
      Assert.AreEqual(randomUri, state.Url);
    }
예제 #4
0
 internal ParseFile(string name, Uri uri, string mimeType = null) {
   state = new FileState {
     Name = name,
     Url = uri,
     MimeType = mimeType
   };
 }
    public Task TestFileControllerSaveWithEmptyResult() {
      var response = new Tuple<HttpStatusCode, IDictionary<string, object>>(HttpStatusCode.Accepted, new Dictionary<string, object>());
      var mockRunner = CreateMockRunner(response);
      var state = new FileState {
        Name = "bekti.png",
        MimeType = "image/png"
      };

      var controller = new ParseFileController(mockRunner.Object);
      return controller.SaveAsync(state, dataStream: new MemoryStream(), sessionToken: null, progress: null).ContinueWith(t => {
        Assert.True(t.IsFaulted);
      });
    }
예제 #6
0
        public Task <FileState> SaveAsync(FileState state,
                                          Stream dataStream,
                                          String sessionToken,
                                          IProgress <ParseUploadProgressEventArgs> progress,
                                          CancellationToken cancellationToken = default(CancellationToken))
        {
            if (state.Url != null)
            {
                // !isDirty
                return(Task <FileState> .FromResult(state));
            }

            if (cancellationToken.IsCancellationRequested)
            {
                var tcs = new TaskCompletionSource <FileState>();
                tcs.TrySetCanceled();
                return(tcs.Task);
            }

            var oldPosition = dataStream.Position;
            var command     = new ParseCommand("/1/files/" + state.Name,
                                               method: "POST",
                                               sessionToken: sessionToken,
                                               contentType: state.MimeType,
                                               stream: dataStream);

            return(commandRunner.RunCommandAsync(command,
                                                 uploadProgress: progress,
                                                 cancellationToken: cancellationToken).OnSuccess(uploadTask => {
                var result = uploadTask.Result;
                var jsonData = result.Item2;
                cancellationToken.ThrowIfCancellationRequested();

                return new FileState {
                    Name = jsonData["name"] as string,
                    Url = new Uri(jsonData["url"] as string, UriKind.Absolute),
                    MimeType = state.MimeType
                };
            }).ContinueWith(t => {
                // Rewind the stream on failure or cancellation (if possible)
                if ((t.IsFaulted || t.IsCanceled) && dataStream.CanSeek)
                {
                    dataStream.Seek(oldPosition, SeekOrigin.Begin);
                }
                return t;
            }).Unwrap());
        }
    public Task<FileState> SaveAsync(FileState state,
        Stream dataStream,
        String sessionToken,
        IProgress<ParseUploadProgressEventArgs> progress,
        CancellationToken cancellationToken = default(CancellationToken)) {
      if (state.Url != null) {
        // !isDirty
        return Task<FileState>.FromResult(state);
      }

      if (cancellationToken.IsCancellationRequested) {
        var tcs = new TaskCompletionSource<FileState>();
        tcs.TrySetCanceled();
        return tcs.Task;
      }

      var oldPosition = dataStream.Position;
      var command = new ParseCommand("files/" + state.Name,
          method: "POST",
          sessionToken: sessionToken,
          contentType: state.MimeType,
          stream: dataStream);

      return commandRunner.RunCommandAsync(command,
          uploadProgress: progress,
          cancellationToken: cancellationToken).OnSuccess(uploadTask => {
            var result = uploadTask.Result;
            var jsonData = result.Item2;
            cancellationToken.ThrowIfCancellationRequested();

            return new FileState {
              Name = jsonData["name"] as string,
              Url = new Uri(jsonData["url"] as string, UriKind.Absolute),
              MimeType = state.MimeType
            };
          }).ContinueWith(t => {
            // Rewind the stream on failure or cancellation (if possible)
            if ((t.IsFaulted || t.IsCanceled) && dataStream.CanSeek) {
              dataStream.Seek(oldPosition, SeekOrigin.Begin);
            }
            return t;
          }).Unwrap();
    }
        public Task TestFileControllerSave()
        {
            var response = new Tuple<HttpStatusCode, IDictionary<string, object>>(HttpStatusCode.Accepted,
              new Dictionary<string, object>() {
            { "name", "newBekti.png"  },
            { "url", "https://www.parse.com/newBekti.png" }
              });
              var mockRunner = CreateMockRunner(response);
              var state = new FileState {
            Name = "bekti.png",
            MimeType = "image/png"
              };

              var controller = new ParseFileController(mockRunner.Object);
              return controller.SaveAsync(state, dataStream: new MemoryStream(), sessionToken: null, progress: null).ContinueWith(t => {
            Assert.False(t.IsFaulted);
            var newState = t.Result;

            Assert.AreEqual(state.MimeType, newState.MimeType);
            Assert.AreEqual("newBekti.png", newState.Name);
            Assert.AreEqual("https://www.parse.com/newBekti.png", newState.Url.AbsoluteUri);
              });
        }
예제 #9
0
 /// <summary>
 /// Saves the file to the Parse cloud.
 /// </summary>
 /// <param name="progress">The progress callback.</param>
 /// <param name="cancellationToken">The cancellation token.</param>
 public Task SaveAsync(IProgress<ParseUploadProgressEventArgs> progress,
     CancellationToken cancellationToken) {
   return taskQueue.Enqueue(
       toAwait => FileController.SaveAsync(state, dataStream, ParseUser.CurrentSessionToken, progress, cancellationToken), cancellationToken)
   .OnSuccess(t => {
     state = t.Result;
   });
 }