Testing and Link disolve Close #8
							parent
							
								
									221b8ff49a
								
							
						
					
					
						commit
						2fcd341fd9
					
				@ -1,2 +1,3 @@
 | 
				
			|||||||
 | 
					sgot.db
 | 
				
			||||||
test.db
 | 
					test.db
 | 
				
			||||||
shrt
 | 
					shrt
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,106 @@
 | 
				
			|||||||
 | 
					package shrty
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"crypto/sha256"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Data struct {
 | 
				
			||||||
 | 
						URL   string `json:"url"`
 | 
				
			||||||
 | 
						URLFetched string `json:"url_fetched"`
 | 
				
			||||||
 | 
						CanonicalURL string `json:"canonical_url"`
 | 
				
			||||||
 | 
						OriginalURL string `json:"original_url"`
 | 
				
			||||||
 | 
						Domain string `json:"domain"`
 | 
				
			||||||
 | 
						Hash string `json:"hash"`
 | 
				
			||||||
 | 
						Token string `json:"token"`
 | 
				
			||||||
 | 
						Meta `json:"meta"`
 | 
				
			||||||
 | 
						FavIconLink string `json:"favicon_url"`
 | 
				
			||||||
 | 
						HTTPStatusCode string `json:"http_code"`
 | 
				
			||||||
 | 
						Category string `json:"category"`
 | 
				
			||||||
 | 
						Created string `json:"created_at"`
 | 
				
			||||||
 | 
						Clicks int64  `json:"clicks"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Meta struct{
 | 
				
			||||||
 | 
							Title string `json:"title"meta:"og:title"`
 | 
				
			||||||
 | 
							Image string `json:"image"meta:"og:image"`
 | 
				
			||||||
 | 
							Description string `json:"description"meta:"og:description"`
 | 
				
			||||||
 | 
							Type string `json:"type"meta:"og:type"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *Store) Short(URL string, value *string) error {
 | 
				
			||||||
 | 
						d := &Data{
 | 
				
			||||||
 | 
							URL: URL,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := CheckURL(d)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Create a sha256 Hash from the URL
 | 
				
			||||||
 | 
						d.Hash = fmt.Sprintf("%x", sha256.Sum256([]byte(d.OriginalURL)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Check if the URL already in the Storage
 | 
				
			||||||
 | 
						if ok := s.Exist(d); ok {
 | 
				
			||||||
 | 
							*value = d.Token
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Iterate to the length of the hash to get the shortest output
 | 
				
			||||||
 | 
						for hashShortestLen := 1; hashShortestLen <= 32; hashShortestLen++ {
 | 
				
			||||||
 | 
							// Test if the Token not exist and return the new generated token
 | 
				
			||||||
 | 
							if _, ok := s.Token[d.Hash[:hashShortestLen]]; !ok {
 | 
				
			||||||
 | 
								d.Token = d.Hash[:hashShortestLen]
 | 
				
			||||||
 | 
								d.Created = time.Now().String()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								s.Token[d.Token] = d
 | 
				
			||||||
 | 
								s.Url[d.Hash] = d.Token
 | 
				
			||||||
 | 
								*value = d.Token
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								s.Save()
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ErrCreateToken
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// URL already Exist in the
 | 
				
			||||||
 | 
					func (s *Store) Exist(d *Data) bool {
 | 
				
			||||||
 | 
						if val, ok := s.Url[d.Hash]; ok {
 | 
				
			||||||
 | 
							d = s.Token[val]
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Returns the URL for the given token
 | 
				
			||||||
 | 
					func (s *Store) Redirect(token string) (string, bool) {
 | 
				
			||||||
 | 
						if shrt, ok := s.Token[token]; ok {
 | 
				
			||||||
 | 
							s.Token[token].Clicks += 1
 | 
				
			||||||
 | 
							s.Save()
 | 
				
			||||||
 | 
							return shrt.OriginalURL, true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return "", false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Get Data for the given Token
 | 
				
			||||||
 | 
					func (s *Store) Get(token string, value *Data) bool {
 | 
				
			||||||
 | 
						if data, ok := s.Token[token]; ok {
 | 
				
			||||||
 | 
							*value = *data
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Get all entries
 | 
				
			||||||
 | 
					func (s *Store) GetAll() string {
 | 
				
			||||||
 | 
						b, err := json.Marshal(&s)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return ""
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return string(b)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,168 @@
 | 
				
			|||||||
 | 
					package shrty
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const path = "short_test.db"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This test seems to be not working correctly
 | 
				
			||||||
 | 
					func TestStorage_Short(t *testing.T) {
 | 
				
			||||||
 | 
						s, err := Open(path)
 | 
				
			||||||
 | 
						defer os.Remove(path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var token string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = s.Short("http://bit.ly/2scBYES", &token)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expected := &Data{
 | 
				
			||||||
 | 
							URL:"http://bit.ly/2scBYES",
 | 
				
			||||||
 | 
							URLFetched:"https://www.youtube.com/watch?v=bouIpFd9VGM",
 | 
				
			||||||
 | 
							CanonicalURL:"",
 | 
				
			||||||
 | 
							OriginalURL:"https://www.youtube.com/watch?v=bouIpFd9VGM",
 | 
				
			||||||
 | 
							Domain:"www.youtube.com",
 | 
				
			||||||
 | 
							Hash:"c921ca733b92ca7b57782e9f12a3fe60dbc6b91a317fc419e13f8f5b5805232f",
 | 
				
			||||||
 | 
							Token:"c",
 | 
				
			||||||
 | 
							Meta: Meta{
 | 
				
			||||||
 | 
								Title:"",
 | 
				
			||||||
 | 
								Image:"",
 | 
				
			||||||
 | 
								Description:"",
 | 
				
			||||||
 | 
								Type:""},
 | 
				
			||||||
 | 
							FavIconLink:"",
 | 
				
			||||||
 | 
							HTTPStatusCode:"200",
 | 
				
			||||||
 | 
							Category:"",
 | 
				
			||||||
 | 
							Created:s.Token[token].Created,
 | 
				
			||||||
 | 
							Clicks:0,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
						assert.Equal(t, expected, s.Token[token])
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Whats wrong with this Test?
 | 
				
			||||||
 | 
					func TestStorage_Get(t *testing.T) {
 | 
				
			||||||
 | 
						s, err := Open(path)
 | 
				
			||||||
 | 
						defer os.Remove(path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var d Data
 | 
				
			||||||
 | 
						empty := Data{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ok := s.Get("notexist", &d)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.Equal(t, empty, d)
 | 
				
			||||||
 | 
						assert.Equal(t, false, ok)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var token string
 | 
				
			||||||
 | 
						err = s.Short("http://bit.ly/2scBYES", &token)
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
						assert.Equal(t, "c", token)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expected := &Data{
 | 
				
			||||||
 | 
							URL:"http://bit.ly/2scBYES",
 | 
				
			||||||
 | 
							URLFetched:"https://www.youtube.com/watch?v=bouIpFd9VGM",
 | 
				
			||||||
 | 
							CanonicalURL:"",
 | 
				
			||||||
 | 
							OriginalURL:"https://www.youtube.com/watch?v=bouIpFd9VGM",
 | 
				
			||||||
 | 
							Domain:"www.youtube.com",
 | 
				
			||||||
 | 
							Hash:"c921ca733b92ca7b57782e9f12a3fe60dbc6b91a317fc419e13f8f5b5805232f",
 | 
				
			||||||
 | 
							Token:"c",
 | 
				
			||||||
 | 
							Meta: Meta{
 | 
				
			||||||
 | 
								Title:"",
 | 
				
			||||||
 | 
								Image:"",
 | 
				
			||||||
 | 
								Description:"",
 | 
				
			||||||
 | 
								Type:""},
 | 
				
			||||||
 | 
							FavIconLink:"",
 | 
				
			||||||
 | 
							HTTPStatusCode:"200",
 | 
				
			||||||
 | 
							Category:"",
 | 
				
			||||||
 | 
							Created:s.Token[token].Created,
 | 
				
			||||||
 | 
							Clicks:0,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ok = s.Get(token, &d)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.Equal(t, expected, &d)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestStore_Exist(t *testing.T) {
 | 
				
			||||||
 | 
						s, err := Open("test.db")
 | 
				
			||||||
 | 
						defer os.Remove(path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						d := &Data{
 | 
				
			||||||
 | 
							URL:"http://bit.ly/2scBYES",
 | 
				
			||||||
 | 
							URLFetched:"https://www.youtube.com/watch?v=bouIpFd9VGM",
 | 
				
			||||||
 | 
							CanonicalURL:"",
 | 
				
			||||||
 | 
							OriginalURL:"https://www.youtube.com/watch?v=bouIpFd9VGM",
 | 
				
			||||||
 | 
							Domain:"www.youtube.com",
 | 
				
			||||||
 | 
							Hash:"c921ca733b92ca7b57782e9f12a3fe60dbc6b91a317fc419e13f8f5b5805232f",
 | 
				
			||||||
 | 
							Token:"c",
 | 
				
			||||||
 | 
							Meta: Meta{
 | 
				
			||||||
 | 
								Title:"",
 | 
				
			||||||
 | 
								Image:"",
 | 
				
			||||||
 | 
								Description:"",
 | 
				
			||||||
 | 
								Type:""},
 | 
				
			||||||
 | 
							FavIconLink:"",
 | 
				
			||||||
 | 
							HTTPStatusCode:"200",
 | 
				
			||||||
 | 
							Category:"",
 | 
				
			||||||
 | 
							Created:time.Now().String(),
 | 
				
			||||||
 | 
							Clicks:0,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						notexist := s.Exist(d)
 | 
				
			||||||
 | 
						assert.Equal(t, false, notexist)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var token string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = s.Short(d.URL, &token)
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						exist := s.Exist(d)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.Equal(t, true, exist)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestStore_Redirect(t *testing.T) {
 | 
				
			||||||
 | 
						s, err := Open(path)
 | 
				
			||||||
 | 
						defer os.Remove(path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						url, ok := s.Redirect("notexist")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.Equal(t, "", url)
 | 
				
			||||||
 | 
						assert.Equal(t, false, ok)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var token string
 | 
				
			||||||
 | 
						err = s.Short("http://bit.ly/2scBYES", &token)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expected := &Data{
 | 
				
			||||||
 | 
							URL:"http://bit.ly/2scBYES",
 | 
				
			||||||
 | 
							URLFetched:"https://www.youtube.com/watch?v=bouIpFd9VGM",
 | 
				
			||||||
 | 
							CanonicalURL:"",
 | 
				
			||||||
 | 
							OriginalURL:"https://www.youtube.com/watch?v=bouIpFd9VGM",
 | 
				
			||||||
 | 
							Domain:"www.youtube.com",
 | 
				
			||||||
 | 
							Hash:"c921ca733b92ca7b57782e9f12a3fe60dbc6b91a317fc419e13f8f5b5805232f",
 | 
				
			||||||
 | 
							Token:"c",
 | 
				
			||||||
 | 
							Meta: Meta{
 | 
				
			||||||
 | 
								Title:"",
 | 
				
			||||||
 | 
								Image:"",
 | 
				
			||||||
 | 
								Description:"",
 | 
				
			||||||
 | 
								Type:""},
 | 
				
			||||||
 | 
							FavIconLink:"",
 | 
				
			||||||
 | 
							HTTPStatusCode:"200",
 | 
				
			||||||
 | 
							Category:"",
 | 
				
			||||||
 | 
							Created:time.Now().String(),
 | 
				
			||||||
 | 
							Clicks:0,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						url, ok = s.Redirect(token)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.Equal(t, expected.OriginalURL, url)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//func TestStore_GetAll(t *testing.T) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					package shrty
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestOpen(t *testing.T) {
 | 
				
			||||||
 | 
						s, err := Open(path)
 | 
				
			||||||
 | 
						defer os.Remove(path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expected := Store{Token: make(map[string]*Data), Url: make(map[string]string)}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
						assert.Equal(t, &expected, s)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					package shrty
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func CheckURL(d *Data) error {
 | 
				
			||||||
 | 
						resp, err := http.Get(d.URL)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							fmt.Println(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer resp.Body.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						d.HTTPStatusCode = fmt.Sprint(resp.StatusCode)
 | 
				
			||||||
 | 
						d.URLFetched = fmt.Sprint(resp.Request.URL)
 | 
				
			||||||
 | 
						d.OriginalURL = fmt.Sprint(resp.Request.URL)
 | 
				
			||||||
 | 
						d.Domain = resp.Request.URL.Host
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					package shrty
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestCheckURL(t *testing.T) {
 | 
				
			||||||
 | 
						data := Data{
 | 
				
			||||||
 | 
							URL: "https://t.co/kA45uWnKkg",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expected := Data{
 | 
				
			||||||
 | 
							URL: "https://t.co/kA45uWnKkg",
 | 
				
			||||||
 | 
							URLFetched: "https://www.youtube.com/watch?v=Qg0pO9VG1J8&utm_content=buffera4269&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer",
 | 
				
			||||||
 | 
							OriginalURL: "https://www.youtube.com/watch?v=Qg0pO9VG1J8&utm_content=buffera4269&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer",
 | 
				
			||||||
 | 
							HTTPStatusCode: "200",
 | 
				
			||||||
 | 
							Domain: "www.youtube.com",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := CheckURL(&data)
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
						assert.Equal(t, expected, data)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue